为什么大型本地数组会使我的程序崩溃,而全局数组不会?

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

本文关键字:数组 全局 崩溃 我的 大型 为什么 程序      更新时间:2023-10-16

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

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

具有大型本地阵列的程序:

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

当我在主函数中声明一个大尺寸的数组时,程序崩溃并显示"SIGSEGV(分段错误)"。

但是,当我将其声明为全局时,一切正常。为什么?

全局声明数组会导致编译器在编译二进制文件的数据部分中包含数组的空间。 在本例中,您将二进制大小增加了 8 MB(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程序内存布局的良好教程。