2

可能重复:
静态变量存储在哪里(在 C/C++ 中)?

我读过所有初始化的全局变量都将在初始化的数据段上分配空间,所有未初始化的静态和全局变量都初始化为0,并在BSS上分配。在以下定义的情况下,

static int i = 0;

i将在哪里分配空间?它会因为i被初始化而在初始化的数据段上,还是因为值为 0 而在 BSS 上i

4

3 回答 3

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
于 2012-12-11T12:34:47.530 回答
0

这实际上取决于实际的编译器/实现,但是是的,i很可能在 BSS 上,因为它要么在文件级别(即在任何函数之外),要么在static函数内部并且具有0.

于 2012-12-11T12:30:16.367 回答
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 段中。

于 2012-12-11T12:54:17.123 回答