函数内部的内置数组的初始化有关问题
函数内部的内置数组的初始化问题
C++ primer上说在函数体外定义的内置数组的元素会初始化为0,函数体内的数组不初始化。为什么函数体内的数组就不初始化呢?
在编译阶段,每个文件中的函数都会被初始化的吧,就是分配了一块内存,但是这块内存的大小是多少呢?我想如果要知道内存大小的话,起码得遍历这个函数体,知道里面定义了哪些东西才行吧。现在发现了里面定义了一个数组,不初始化这个数组也能知道数组的大小吗?是通过数组的长度知道的?
就算不初始化数组也可以给函数分配内存的话,给函数体内的数组初始化又有什么不妥呢?
------解决方案--------------------
函数体内的数组 也就是局部变量了。
局部变量在运行时,进入函数调用的时候才分配的内存。
------解决方案--------------------
函数外的变量位于数据段,程序启动的时候初始化一次。
而函数内部的auto数组,在栈上,每次函数被调用时自动分配,函数返回自动释放,如果每次调用函数都进行初始化,效率太低。
------解决方案--------------------
函数代码占用的代码内存和函数工作时使用的数据内存完全没有关系
------解决方案--------------------
函数内部的变量,包括数组,都是不分配空间的;
运行时,这些变量表示为相对与栈顶的偏移。
C是追求效率的,对这些空间,默认是不初始化的,毕竟得花时间。
------解决方案--------------------
函数内的数据都只是移动一下栈指针
------解决方案--------------------
函数内存大小不必知道的
你想岔了
------解决方案--------------------
调用一个函数 进入函数前 会调整esp ebp 调整函数栈 通过esp来读取数据
不必提前知道分配多少内存 进入函数自动分配
------解决方案--------------------
函数在编译后就是汇编代码,实际就在代码段。如果不运行到该代码段,那写局部变量啥的就都是一堆指令,没有执行,没有执行就当然不会分配空间,不会分配空间自然就没有值。
C++ primer上说在函数体外定义的内置数组的元素会初始化为0,函数体内的数组不初始化。为什么函数体内的数组就不初始化呢?
在编译阶段,每个文件中的函数都会被初始化的吧,就是分配了一块内存,但是这块内存的大小是多少呢?我想如果要知道内存大小的话,起码得遍历这个函数体,知道里面定义了哪些东西才行吧。现在发现了里面定义了一个数组,不初始化这个数组也能知道数组的大小吗?是通过数组的长度知道的?
就算不初始化数组也可以给函数分配内存的话,给函数体内的数组初始化又有什么不妥呢?
C++
数组
内置
------解决方案--------------------
函数体内的数组 也就是局部变量了。
局部变量在运行时,进入函数调用的时候才分配的内存。
------解决方案--------------------
函数外的变量位于数据段,程序启动的时候初始化一次。
而函数内部的auto数组,在栈上,每次函数被调用时自动分配,函数返回自动释放,如果每次调用函数都进行初始化,效率太低。
------解决方案--------------------
函数代码占用的代码内存和函数工作时使用的数据内存完全没有关系
------解决方案--------------------
函数内部的变量,包括数组,都是不分配空间的;
运行时,这些变量表示为相对与栈顶的偏移。
C是追求效率的,对这些空间,默认是不初始化的,毕竟得花时间。
------解决方案--------------------
函数内的数据都只是移动一下栈指针
------解决方案--------------------
函数内存大小不必知道的
你想岔了
------解决方案--------------------
调用一个函数 进入函数前 会调整esp ebp 调整函数栈 通过esp来读取数据
不必提前知道分配多少内存 进入函数自动分配
------解决方案--------------------
函数在编译后就是汇编代码,实际就在代码段。如果不运行到该代码段,那写局部变量啥的就都是一堆指令,没有执行,没有执行就当然不会分配空间,不会分配空间自然就没有值。