所有初始化的全局/静态变量都将转到初始化数据部分。
所有未初始化的全局/静态变量将转到未初始化数据部分(BSS)。在程序加载期间,bss中的变量将得到一个值0。
如果全局变量显式初始化为零(int myglobal = 0),则该变量将存储在哪里?

最佳答案

编译器可以将这些变量放入bssdata中。例如,gcc有一个special option控制这样的行为:
-fno-zero-initialized-in-bss
如果目标支持bss部分,gcc默认情况下会将初始化为零的变量放入bss中。这个
可以在生成的代码中节省空间。此选项关闭此
行为,因为有些程序显式地依赖于
数据部分。例如,这样生成的可执行文件可以找到
本节开头和/或在此基础上做出假设。
默认值为-fzero-initialized-in-bss
尝试使用以下示例(test.c文件):

int put_me_somewhere = 0;

int main(int argc, char* argv[]) { return 0; }

无选项编译(隐式-fzero-initialized-in-bss):
$ touch test.c && make test && objdump -x test | grep put_me_somewhere
cc     test.c   -o test
0000000000601028 g     O .bss   0000000000000004              put_me_somewhere

使用-fno-zero-initialized-in-bss选项编译:
$ touch test.c && make test CFLAGS=-fno-zero-initialized-in-bss && objdump -x test | grep put_me_somewhere
cc -fno-zero-initialized-in-bss    test.c   -o test
0000000000601018 g     O .data  0000000000000004              put_me_somewhere

关于c - 如果全局变量初始化为0,它将进入BSS吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8721475/

10-15 17:52