为什么大型本地阵列会导致我的程序崩溃,但是全局阵列不会崩溃?

时间:2014-04-08 18:44:26

标签: c++ c arrays

使用大型全局数组编程:

int ar[2000000];

int main()
{
}

使用大型本地数组编程:

int main()
{
    int ar[2000000];
}

当我在main函数中声明一个大尺寸的数组时,程序崩溃并出现“SIGSEGV(Segmentation fault)”。

但是,当我宣布它为全局时,一切正常。那是为什么?

1 个答案:

答案 0 :(得分:18)

全局声明数组会导致编译器在已编译二进制文件的数据部分中包含数组的空间。在这种情况下,您将二进制大小增加了8 MB(每个int 2000000 * 4个字节)。但是,这确实意味着内存始终可用,不需要在堆栈或堆上分配。

编辑:@Blue Moon正确指出未初始化的数组很可能会在bss数据段中分配,实际上可能不会占用额外的磁盘空间。将静态分配初始化数组。

当你在程序中声明一个大的数组时,你可能已超过程序的堆栈大小(并且具有讽刺意味的是stack overflow)。

动态分配大型数组的更好方法是使用指针并在堆上分配内存,如下所示:

using namespace std;
int main() {
  int *ar;
  ar = malloc(2000000 * sizeof(int));

  if (ar != null) {
    // Do something 
    free(ar);
  }

  return 0;
}

关于Memory Layout of C Programs can be found here的好教程。