C中静态变量的内存分配

时间:2012-12-11 12:23:07

标签: c

  

可能重复:
  Where are static variables stored (in C/C++)?

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

static int i = 0;

i的空间分配给哪里?它是否在初始化数据段上,因为i已初始化,或者它是否在BSS上,因为i的值为0?

3 个答案:

答案 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段。