【问题标题】:Memory allocation for static variable in C [duplicate]C中静态变量的内存分配[重复]
【发布时间】:2012-11-29 00:18:25
【问题描述】:

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

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

static int i = 0;

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

【问题讨论】:

  • 看看这个:question-1294772
  • 这是一个关于在某些特定平台上实际发生什么、标准要求发生什么、可能发生什么或什么的问题?
  • 我想知道它会表现出什么样的行为,如果行为是明确定义的,需要发生什么。
  • @Raj 代码的行为定义明确。无论最终是数据段、BSS 段还是完全其他的东西,都 100% 取决于平台和工具的特定组合。
  • @Raj - 请记住我的回答(如下),它依赖于实现......但这对于 Ubuntu/GCC 是正确的。您可以使用类似的方法查看其他系统。

标签: c


【解决方案1】:

是的,未初始化的静态变量默认会初始化为 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我认为文件范围和函数范围都与存储无关。范围没有理由影响非自动变量的位置;范围仅在编译代码时进行管理,以禁止生成超出范围的内存访问。我同意它依赖于编译器。
    【解决方案3】:

    当我编译这个程序时,它依赖于实现,在带有 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 段中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      相关资源
      最近更新 更多