【问题标题】:How global declaration of largly sized array works in C?大型数组的全局声明如何在 C 中工作?
【发布时间】:2016-03-28 12:18:19
【问题描述】:
#define N 10000000
int arr[N];

int main(void)
{
   int i;
   for(i=0;i<N;i++)
      arr[i]=i+1;
}

为什么全局声明数组不会产生任何编译错误?堆栈中 N*4 字节的连续内存可用的机会是多少? 使用 static 关键字声明数组也是如此。

【问题讨论】:

  • 全局变量通常放在databss 部分,而不是放在堆栈中。
  • ...这是因为全局变量是全局的。不仅仅对一个函数可见。

标签: c arrays global-variables


【解决方案1】:

这张图片应该会有所帮助。您可以看到,在堆栈上,我们只为局部变量和数组以及函数调用和指针分配内存。 而全局变量/静态存储在 Perm Storage 上。

【讨论】:

  • “通常”在您的帖子中的某处会很好。实际上,所有这些都取决于编译器/链接器,并没有在任何地方指定。 C 规范只是将 requirements 放在存储上,而不是放在需要的地方。我有一个编译器将全局变量放在堆栈的最底部(即向上main 的堆栈帧)。
【解决方案2】:

全局、静态全局、静态变量不需要入栈。 堆栈用于临时存在且与函数调用相关的变量,与作为单个存在且始终存在于内存实体中的静态/全局变量完全相反。

此外,由于 C 规范中对此进行了说明,因此静态和/或全局变量默认初始化为零。由于大多数(如果不是全部)编译器不会将它们放入堆栈中,因此在程序执行时间方面没有任何成本。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多