在Linux上,我有一个代码,该代码使用在main函数内声明的数组,其数组为2MB + 1字节

#include <stdio.h>
#include <stdlib.h>

#define MAX_DATA (2097152)  /* 2MB */

int main(int argc, char *argv[])
{
    /* Reserve 1 byte for null termination */
    char data[MAX_DATA + 1];

    printf("Bye\n");

    return 0;
}

当我使用gcc在Linux上编译时,我可以毫无问题地运行它。但是在Windows上,我遇到运行时错误。在运行时,我有5GB的可用内存。

为了解决Windows上的问题,我需要指定其他堆栈大小:
gcc -Wl,--stack,2097153 -o test.exe test.c

或在主函数之外声明数据数组。

因为在linux上编译的程序被链接而没有更改堆栈大小?

为什么它在Linux上可以正常运行但在Windows上无法运行?
我使用相同的源代码和相同的gcc指令:
gcc -Wall -O source.c -o source

因为我认为在Linux上执行malloc是不可靠的,因为即使内存不可用,它也可以返回非null指针。

我认为在Linux上运行的程序中,它可能会默默地忽略堆栈问题吗?

在Linux上运行的未链接但未更改堆栈大小但在运行时不会像Windows一样失败的程序是否可能无视了堆栈问题?

另外,为什么要在主函数之外声明数组,在Windows上也可以正常工作?万一使用堆,为什么我不需要释放它呢?

最佳答案



因为进程或线程的默认堆栈大小取决于系统,所以:

  • 在Windows上为default stack reservation size used by the linker is 1 MB
  • 在Linux/Unix上,最大堆栈大小可以为configured through the ulimit command。另外,您可以在创建新线程时配置堆栈大小。



  • 我想您正在谈论overcommit issue。为了克服这个问题,您可以使用calloc并检查返回值。如果在应用程序的最开始处执行此操作,则可以立即退出并显示相应的错误消息。

    10-04 13:36