关于c ++:为什么一个大的本地数组会崩溃我的程序,但全局的数组不会崩溃?

Why does a large local array crash my program, but a global one doesn't?

具有大型全局数组的程序:

1
2
3
4
5
int ar[2000000];

int main()
{
}

具有大型本地数组的程序:

1
2
3
4
int main()
{
    int ar[2000000];
}

当我在主函数中声明一个大数组时,程序会崩溃,并出现"sigsegv(segmentation fault)"。

但是,当我宣布它是全球性的时,一切都很好。为什么会这样?


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

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

当您在程序中声明一个如此大的数组时,您可能已经超过了程序的堆栈大小(具有讽刺意味的是,这会导致堆栈溢出)。

动态分配大数组的更好方法是使用指针并像这样分配堆上的内存:

1
2
3
4
5
6
7
8
9
10
11
12
using namespace std;
int main() {
  int *ar;
  ar = malloc(2000000 * sizeof(int));

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

  return 0;
}

关于C程序内存布局的一个很好的教程可以在这里找到。