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

标签 c++ c arrays

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

int ar[2000000];

int main()
{
}

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

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

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

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

最佳答案

全局声明数组会导致编译器将数组空间包含在已编译二进制文件的数据部分中。在本例中,您已将二进制大小增加了 8 MB(2000000 * 每个 int 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/60059658/

相关文章:

javascript - Javascript 中对象创建的异常行为

c++ - 在 grpc 服务器端调用时检索 SSL 证书

c++ - QtCreator 找不到cmake

c++ - 共享库中定义的错误符号 'using namespace'

c - _builtin_prefetch()中第二个参数的作用是什么?

为 CPU Arch 交叉编译或编译 native

arrays - 二分查找运行时间

c++ - 获得字符串的长度后,如何将长度数字捕获为整数变量以供其他地方使用?

c - (int_1 += *pointer++ = int_2++) < int_3 是什么意思?

python - 如何在递归中创建整数数组?