为啥大型本地数组会使我的程序崩溃,而全局数组却不会? [复制]

Posted

技术标签:

【中文标题】为啥大型本地数组会使我的程序崩溃,而全局数组却不会? [复制]【英文标题】:Why does a large local array crash my program, but a global one doesn't? [duplicate]为什么大型本地数组会使我的程序崩溃,而全局数组却不会? [复制] 【发布时间】:2014-04-08 18:44:25 【问题描述】:

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

int ar[2000000];

int main()


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

int main()

    int ar[2000000];

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

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

【问题讨论】:

【参考方案1】:

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

编辑:@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上的一个很好的教程。

【讨论】:

另外不要忘记检查 malloc 是否成功 在 Visual Studio 中,您可以使用它来增加堆栈的最大大小:msdn.microsoft.com/en-us/library/tdkhxaks.aspx 虽然关于全局变量和具有显式静态持续时间的对象的整个事情——去哪里——是一个实现细节,但通常未初始化的变量会转到 .bss 部分并且不会扩大二进制大小。还有using namespace std; is frowned upon in C++. @dkrikun,好主意,谢谢。 在执行期间,静态初始化的数组被加载到 RAM 中并在 RAM 中进行操作。内存不仅仅是堆和堆栈。有关详细信息,请参阅答案中引用的教程。

以上是关于为啥大型本地数组会使我的程序崩溃,而全局数组却不会? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥大型静态数组会产生段错误而动态却不会? (C++)

为啥添加导航控制器会使我的数组消失?

为啥 __inbyte 会使我的软件崩溃?

为啥这个旧的依赖会使我的 gradle 崩溃?

为啥在 C 中使用错误的格式说明符会使我的程序在 Windows 7 上崩溃?

为啥 ntdll.dll 会使我的 c++ 可执行文件崩溃?