为什么在c++中声明全局数组时,它可以给出的大小比在main中声明的要大[重复]

问题描述 投票:0回答:2

在将数组声明为全局时,我可以将其大小指定为 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;
}
c++ arrays global-variables program-entry-point local-variables
2个回答
4
投票

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


3
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.