为什么在 C++ 中声明一个全局数组时,它可以给出的大小比在 main 中声明的要大
Why on declaring an array global in c++, the size that it can be given is larger than declaring it in main
在将数组声明为全局数组时,我可以将其大小设为 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;
}
查看 this 程序解剖图。在您的第二个实现中,内存是在堆栈上分配的,根据图片,它有 8MB 的限制(不同的机器可能有不同的限制)。您的阵列将占用大约 20MB 的内存。数据段大于 8MB,因此尝试分配此类数组时不会抛出错误
在main
中,数组分配在堆栈上。堆栈大小的默认限制为 8MB。该数组为 20 MB,因此发生堆栈溢出。
全局数组分配在数据段上。只要有可用内存,数据段大小默认是无限的。
运行 ulimit -a
bash
中的命令以查看程序的默认限制。
在将数组声明为全局数组时,我可以将其大小设为 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;
}
查看 this 程序解剖图。在您的第二个实现中,内存是在堆栈上分配的,根据图片,它有 8MB 的限制(不同的机器可能有不同的限制)。您的阵列将占用大约 20MB 的内存。数据段大于 8MB,因此尝试分配此类数组时不会抛出错误
在main
中,数组分配在堆栈上。堆栈大小的默认限制为 8MB。该数组为 20 MB,因此发生堆栈溢出。
全局数组分配在数据段上。只要有可用内存,数据段大小默认是无限的。
运行 ulimit -a
bash
中的命令以查看程序的默认限制。