int x = 10;
int y = 0;
int z;
static int m = 0;
这是我的3个全局变量。
我知道__未初始化的全局数据___会进入.BSS段,但是全局数据初始化为 0 。
将在哪个段中存储变量y和m。
这里有编译器相关的依赖吗?
答案 0 :(得分:1)
静态分配的全局变量变量y
和m
可以移动到bss部分,这些全局变量用仅由零值位组成的值初始化。这具有编译器依赖性。
编译器可以自由地将这样的变量放入bss以及数据中。
GCC有以下编译器选项来决定:
-fno-零初始化功能于BSS
如果目标支持BSS部分,则GCC默认将初始化为零的变量放入BSS。这可以节省生成的代码中的空间。上面的选项会关闭此行为。
MSVC具有以下预处理器指令:
答案 1 :(得分:0)
(不是我自己的话)
在C中,没有显式初始值设定项的静态分配对象初始化为零(对于算术类型)或空指针(对于指针类型)。 C的实现通常使用仅由零值位组成的位模式表示零值和空指针值(尽管C标准不要求这样做)。因此, bss部分通常包括在文件范围(即,在任何函数之外)声明的所有未初始化变量以及使用static关键字声明的未初始化的局部变量。 实现还可以将静态分配的变量分配给bss部分,该变量使用仅由零值位组成的值进行初始化。
http://en.wikipedia.org/wiki/.bss
z未初始化,因此它会下注到BSS中。但是你在问题中没有这么说吗?
你和m也可能会去那里。不过,不确定你是否打算询问他们。然后X将转到数据段。