我已经读过初始化的所有全局变量都将在初始化数据段上分配空间,并且所有未初始化的静态和全局变量都被初始化为0,并在BSS上分配。如果有以下定义,
static int i = 0;
将i
的空间分配给哪里?它是否在初始化数据段上,因为i
已初始化,或者它是否在BSS上,因为i
的值为0?
答案 0 :(得分:9)
是的,默认情况下,非初始化的静态变量将初始化为0,在C中始终为真。
数据的存储位置将取决于实现...我已经看到它是.0(在你的情况下是i
)进入.BSS(由符号开始的块)。
非0初始化静态进入.DATA static int i=2;
例如。
要表明观点:
int main(int argc, char * argv[])
{
return 0;
}
保存在“test.c”
中> gcc test.c
> size a.out
text data bss dec hex filename
1056 252 8 1316 524 a.out
然后我们这样更新:
int main(int argc, char * argv[])
{
static int i;
return 0;
}
> gcc test.c
> size a.out
text data bss dec hex filename
1056 252 12 1316 524 a.out
再次更改:
int main(int argc, char * argv[])
{
static int i = 2;
return 0;
}
> gcc test.c
> size a.out
text data bss dec hex filename
1056 256 8 1316 524 a.out
答案 1 :(得分:0)
这实际上取决于实际的编译器/实现,但是,i
很可能在BSS上,因为它在文件级别(即在任何函数之外)或static
和函数内部并且值为0
。
答案 2 :(得分:0)
当我编译这个程序时,它依赖于实现,在Linux上使用gcc 4.5.2:
static int a[1000000] = {1}; void main() {}
我得到大小为3.9M的可执行文件 - 数组的第一个元素被初始化(具有非零值),因此数组'a'转到.data段。
当我用零初始化数组时:
static int a[1000000] = {0}; void main() {}
我得到大小为8.2K的可执行文件 - 我猜这种大小的差异表明这次'a'数组位于.bss段。