为什么“定义在函数体内部的内置类型变量将不被初始化”,而“定义于任何函数体之外的变量被初始化为0“?
问题中的两句话来自《C++ Primer》。定义在函数体之外的变量即全局变量放在全局区存储,并初始化为0。那么定义在函数体内的局部变量在栈中分配空间时为什么不同时也给它初始化为0呢?为什么C++要允许未定义的值存在呢?
把没有特别指定初始值的全局空间初始化为0不需要程序本身付出任何直接成本。程序不需要额外的数据记录这些0,也不需要额外的代码去设置这些0,这活操作系统直接就能替你干了。而初始化成0,实际上就是抹去内存中原来的数据,这很政治正确。
对于局部变量,初始化必须通过函数内代码实现,不论空间还是时间都有成本,而且是每次调用都有的时间成本。而栈中的数据本来也都是应用自己的数据,不存在抹不抹的问题。
全局变量分2种,一是有初始值,二是没有初始值。
如
int i=0;
int j;
int k=1;
int m;
感兴趣的可以打印下以上全局变量的地址。i,j并不是连续存放,i,k连续存放j,m连续存放。
编译之后,有初始化数据的变量放到data段,初始值就放在可执行程序里。程序加载的时候,除了加载代码段,还要加载data段。这样的变量越大越多,可执行程序就越大。
而没有初始化数据的全局变量放在另外的段,一般叫bss段。这个区域不占用可执行程序的空间。即你无论申明多大的未初始化变量,可执行程序也不会变大。加载程序时候,只需要分配相应大小的内存。分配内存之后可以初始化为0,也可以初始化为0xcccccccc,也有可能不初始化,看操作系统跟加载程序以及内存分配算法(有的内存分配的时候也会初始化为0)。因此你说的全局变量初始化为0是不正确的。有的系统是,有的系统不是。
有初始化数据的data段是加载程序的时候初始化的,程序运行之后不会再次初始化。如果你在程序执行过程中,跳到入口那里重新执行,那么这些变量不会再次初始化。
还有一种变量初始化是靠指令的。比如申明全局变量,然后在main函数初始化。
另外就是栈变量,栈变量初始化也是用指令的。比如int i=123;那么编译成汇编可以看到有对栈变量赋值123的指令。因此只要函数每次被调用,都会重新初始化。
渣渣程序员
C++需要自己操心的太多,标准中是这么规定的,“定义于任何函数体之外的变量被初始化为0“这句话已经有人给你解释了,全局变量清内存再用,“定义在函数体内部的内置类型变量将不被初始化”这句话你如果想自己调试看,不同的编译器有不同的结果,程序定义变量的方式就是在内存中选一段大小为 sizeof xx 的内存,局部变量的值取决于这块内存,有点编译器会初始化成0,这根标准无关。
c语言中,若在函数内部定义变量时没有给变量赋予初值,如int a;,则a的初始值为局部变量未初始化就是一个随机值,如果声明的int为全局变量会默认初始化为0
变量的定义实际是指定了一个内存的单元而已,如果刚开机也许是0
大多不确定,是个随机数
而其他的语言大多是0,
这就是C 的特别之处,一般都要预先赋初值,语言省事了,编程的人麻烦一点点