所有初始化的全局/静态变量都将转到初始化数据部分。
所有未初始化的全局/静态变量将转到未初始化数据部分(BSS)。在程序加载期间,bss中的变量将得到一个值0。
如果全局变量显式初始化为零(int myglobal = 0
),则该变量将存储在哪里?
最佳答案
编译器可以将这些变量放入bss
和data
中。例如,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/