C++ 为什么大型本地阵列会使我的程序崩溃,而全局阵列不会';T
具有大型全局阵列的程序:C++ 为什么大型本地阵列会使我的程序崩溃,而全局阵列不会';T,c++,c,arrays,C++,C,Arrays,具有大型全局阵列的程序: int ar[2000000]; int main() { } 具有大型本地阵列的程序: int main() { int ar[2000000]; } 当我在main函数中声明一个较大的数组时,程序会因“SIGSEGV(Segmentation fault)”而崩溃 然而,当我宣布它是全球性的时,一切都很好。这是为什么?全局声明数组会导致编译器在已编译二进制文件的数据段中包含数组的空间。在本例中,您将二进制大小增加了8MB(2000000*4字节/int
int ar[2000000];
int main()
{
}
具有大型本地阵列的程序:
int main()
{
int ar[2000000];
}
当我在main函数中声明一个较大的数组时,程序会因“SIGSEGV(Segmentation fault)”而崩溃
然而,当我宣布它是全球性的时,一切都很好。这是为什么?全局声明数组会导致编译器在已编译二进制文件的数据段中包含数组的空间。在本例中,您将二进制大小增加了8MB(2000000*4字节/int)。但是,这意味着内存始终可用,不需要在堆栈或堆上分配 编辑:@Blue Moon正确地指出,未初始化的阵列很可能会分配到
bss
数据段,实际上可能不会占用额外的磁盘空间。初始化的数组将静态分配
当您在程序中声明一个如此大的数组时,您可能已经超过了程序的堆栈大小(具有讽刺意味的是,这会导致错误)
动态分配大数组的更好方法是使用指针并在堆上分配内存,如下所示:
using namespace std;
int main() {
int *ar;
ar = malloc(2000000 * sizeof(int));
if (ar != null) {
// Do something
free(ar);
}
return 0;
}
关于的一个很好的教程。也不要忘了检查malloc在Visual Studio中是否成功,您可能可以使用它来增加堆栈的最大大小:而关于全局变量和具有显式静态持续时间的对象的全部内容(哪里去了什么)是一个实现细节,通常未初始化的变量会转到.bss部分,并且不会增大二进制大小。@dkrikun,好主意,谢谢。在执行过程中,静态初始化的数组被加载到RAM中,并在RAM中进行操作。内存不仅仅是堆和堆栈。有关更多信息,请参见答案中引用的教程。