为什么一个大的本地数组会崩溃我的程序,但是全局程序不会崩溃?
具有大型全局数组的程序:
int ar[2000000]; int main() { }
使用大型本地数组的程序:
int main() { int ar[2000000]; }
当我在main函数中声明一个大尺寸的数组时,程序会崩溃并出现“SIGSEGV(Segmentation fault)”。
但是,当我将其声明为全局时,一切正常。 这是为什么?
全局声明数组会导致编译器在已编译二进制文件的数据部分中包含数组的空间。 在这种情况下,您将二进制大小增加了8 MB(每个int 2000000 * 4个字节)。 但是,这确实意味着内存始终可用,不需要在堆栈或堆上分配。
编辑:@Blue Moon正确地指出, 未初始化的数组很可能会在bss
数据段中分配,实际上可能不会占用额外的磁盘空间。 初始化的数组将静态分配。
当你在程序中声明一个大的数组时,你可能已经超过了程序的堆栈大小(并且具有讽刺意味的是堆栈溢出 )。
动态分配大型数组的更好方法是使用指针并在堆上分配内存,如下所示:
using namespace std; int main() { int *ar; ar = malloc(2000000 * sizeof(int)); if (ar != null) { // Do something free(ar); } return 0; }
可在此处找到有关C程序的内存布局的精彩教程。