可能重复:
静态变量存储在哪里(在 C/C++ 中)?
我读过所有初始化的全局变量都将在初始化的数据段上分配空间,所有未初始化的静态和全局变量都初始化为0,并在BSS上分配。在以下定义的情况下,
static int i = 0;
i
将在哪里分配空间?它会因为i
被初始化而在初始化的数据段上,还是因为值为 0 而在 BSS 上i
?
可能重复:
静态变量存储在哪里(在 C/C++ 中)?
我读过所有初始化的全局变量都将在初始化的数据段上分配空间,所有未初始化的静态和全局变量都初始化为0,并在BSS上分配。在以下定义的情况下,
static int i = 0;
i
将在哪里分配空间?它会因为i
被初始化而在初始化的数据段上,还是因为值为 0 而在 BSS 上i
?
是的,未初始化的静态变量默认会初始化为 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
这实际上取决于实际的编译器/实现,但是是的,i
很可能在 BSS 上,因为它要么在文件级别(即在任何函数之外),要么在static
函数内部并且具有0
.
当我编译这个程序时,它依赖于实现,在具有 gcc 4.5.2 的 Linux 上:
static int a[1000000] = {1}; void main() {}
我得到了大小为 3.9M 的可执行文件 - 数组的第一个元素被初始化(具有非零值),因此数组 'a' 转到 .data 段。
当我用零初始化数组时:
static int a[1000000] = {0}; void main() {}
我得到了大小为 8.2K 的可执行文件——我猜这种大小的差异表明这次“a”数组位于 .bss 段中。