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

use*_*314 13 c c++ arrays

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

int ar[2000000];

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

使用大型本地数组的程序:

int main()
{
    int ar[2000000];
}
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*uck 19

全局声明数组会导致编译器在编译的二进制文件的数据部分中包含数组的空间.在这种情况下,您将二进制大小增加了8 MB(每个int 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;
}
Run Code Online (Sandbox Code Playgroud)

可在此处找到有关C程序内存布局的精彩教程.

  • 在执行期间,静态初始化的数组被加载到RAM中并在RAM中操作.内存比堆和堆栈更多.有关详细信息,请参阅答案中引用的教程. (2认同)