全局区初始化和未初始化的区别

最后更新于 2024-09-10 6249 次阅读


存放位置不同

全局变量初始化而且初始值不为0,那么这样的全局变量是放在内存的.data段的,如果全局变量初始值为0或者未初始化,那么这样的全局变量是放在.bss段的。

是否分配空间规则不同

bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。

data段(已手动初始化的数据)则为数据分配空间,数据保存在目标文件中。

链接规则不同

在C语言里,全局变量如果不初始化的话,默认为0,也就是说在全局空间里:int x =0; 跟 int x; 的效果看起来是一样的。但其实这里面的差别很大,强烈建议大家所有的全局变量都要初始化,他们的主要差别如下:

编译器在编译的时候针对这两种情况会产生两种符号放在目标文件的符号表中,对于初始化的,叫强符号,未初始化的,叫弱符号。连接器在连接目标文件的时候,如果遇到两个重名符号,会有以下处理规则:

  • 如果有多个重名的强符号,则报错。
  • 如果有一个强符号,多个弱符号,则以强符号为准。
  • 如果没有强符号,但有多个重名的弱符号,则任选一个弱符号。

大部分情况下,我们不希望连接器为我们做决定,所以我不是很认同后两个规则,至少应该给个警告,而不应该安静地通过。因为这种问题引起的bug会很难查,所以我们要尽量把全局变量初始化,对于不想给别的文件引用的变量,也尽量用static修饰。