【问题标题】:Does a large static array corrupt the stack?大型静态数组是否会破坏堆栈?
【发布时间】:2014-12-19 10:38:28
【问题描述】:

我有一些代码如下:

typedef struct _X
{
  int array[1000];
}X;

static X x;

int main()
{
   x.array[0] =100;

}

我的问题是,在 main() 中,当 x 被引用时,它会在堆栈上消耗 4*1000 字节吗?如果线程堆栈大小有限,它可以粉碎堆栈吗?

【问题讨论】:

  • 由于x 被声明为全局线程数无关紧要,因为每个线程都使用x 的相同“实例”。要让每个线程都使用自己的x“实例”,它需要被声明为thread local

标签: c stack stack-overflow


【解决方案1】:

x 不占用堆栈中的内存。它具有静态存储持续时间(和内部链接)并在静态内存中分配。

此声明

x.array[0] =100;

不处理栈内存。

【讨论】:

  • 我想你应该解释一下“存储持续时间”和“链接”这两个术语。
  • @Kay 他们是其他问题。:) 任何人都可以提出相应的问题,如果他感兴趣的话。
  • 那么上面的代码和分配指针并使用它在性能方面/其他方面是否存在差异。 ( x->array[0] =100)
  • @jogabonito 很明显,动态分配内存需要更多时间来静态分配。
【解决方案2】:

您的x 是一个静态数组,因此它存储在数据段中,占用内存为 4000 个整数。不使用堆栈。

【讨论】:

    【解决方案3】:

    由于您已经将x 声明为静态,因此不会在堆栈上分配内存。它将存储在未初始化的数据段中。

    欲了解更多信息:Memory management in C

    【讨论】:

    • 它转到 .bss,而不是 .data。
    • @bss AFAIK bss 是一个数据段。
    • ELF、PE 和可能大多数其他格式在初始化和未初始化数据段之间划分。正如参考文件所说,也是。 .data 用于初始化数据,.bss 用于“未初始化数据”(即在动态链接时将被清零的数据)。
    • @Kay:如果我错了,请纠正我,静态成员默认初始化为零。
    • @Kay:感谢您的纠正。你说的对。在 wiki 上找到更多信息。进行了更改。
    猜你喜欢
    • 2011-11-01
    • 2014-01-31
    • 1970-01-01
    • 2018-02-26
    • 2011-04-21
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多