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

标签 c++ c arrays

<分区>

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

int ar[2000000];

int main()
{
}

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

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

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

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

最佳答案

全局声明数组会导致编译器在已编译二进制文件的数据部分中包含数组的空间。在这种情况下,您将二进制大小增加了 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 的一个很好的教程.

关于c++ - 为什么大型本地数组会使我的程序崩溃,而全局数组却不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50834446/

相关文章:

c++ - 来自第 3 方静态库的回调中未捕获的异常

c++ - 如何在 ns3 中使用属性

c++ - `Multiple definitions` 错误指向 pthread.h

c++ - 带有模拟C函数的谷歌模拟链接错误

javascript - 使用 map 将二维字符串数组转换为拆分数值数组

python - numpy loadtxt 单行/行作为列表

c - 传递第一个索引为空的非空字符串数组

c++ - 如何使用 std::string 以正确的方式存储字节(无符号字符)?

c++ - 如何用 'malloc' 和 'free' 替换 'new' 和 'delete' ?

c++ - 从 char** 到 const char** 的隐式转换