为啥在c ++中声明一个全局数组时,它可以给出的大小大于在main中声明它[重复]

Posted

技术标签:

【中文标题】为啥在c ++中声明一个全局数组时,它可以给出的大小大于在main中声明它[重复]【英文标题】:Why on declaring an array global in c++, the size that it can be given is larger than declaring it in main [duplicate]为什么在c ++中声明一个全局数组时,它可以给出的大小大于在main中声明它[重复] 【发布时间】:2015-12-01 07:29:09 【问题描述】:

在将数组声明为全局时,我可以将其大小设为 5000000 bt,但当我在 main 中声明它时是不可能的,为什么?

工作正常

#include<iostream>

int arr[5000000];
using namespace std;
int main()
 
  arr[0]=1;
  cout<<arr[0];
  return 0;

分段错误

#include<iostream>

using namespace std;
int main()

  int arr[5000000];
  arr[0]=1;
  cout<<arr[0];
  return 0;

【问题讨论】:

使用std::vector&lt;int&gt; arr(5000000); 在堆上分配数据。 【参考方案1】:

查看this 程序解剖图。在您的第二个实现中,内存是在堆栈上分配的,根据图片,它有 8MB 的限制(不同的机器可能有不同的限制)。您的阵列将占用大约 20MB 的内存。数据段大于 8MB,因此在尝试分配此类数组时不会引发错误

【讨论】:

【参考方案2】:

main 中,数组分配在堆栈上。堆栈大小的默认限制为 8MB。数组是 20 MB,所以会发生堆栈溢出。

全局数组分配在数据段上。只要有可用内存,数据段大小默认不受限制。

bash 中运行ulimit -a 命令以查看程序的默认限制。

【讨论】:

以上是关于为啥在c ++中声明一个全局数组时,它可以给出的大小大于在main中声明它[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我在函数中声明一个名称为全局数组的局部数组时,bash 会引发未绑定变量警告?

为啥全局数组大小应该是一个整数常量?

在 C 中声明两个同名的全局变量

为啥要在 C 中声明一个只包含数组的结构?

C语言中怎样在头文件中定义一个能够在所有文件中都可以使用的全局数组变量 ?

如何声明一个全局结构数组并在不同的函数中使用它?