堆栈溢出在Linux上沉默?

在Linux上,我有一个代码,它使用在主函数内部声明的数组,并且具有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("Byen");

    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实现我认为是不可靠的,因为即使内存不可用,它也可以返回一个非空指针。

我认为,在Linux上运行的程序中,它可能默默无视堆栈问题?

在Linux上运行的程序可能会改变堆栈大小,但不会在Windows运行时在运行时失败,它会默默地忽略堆栈问题?

另外,为什么如果我声明的主要功能之外的数组它可以在Windows上正常工作? 如果它使用堆,为什么我不需要释放它?


为什么它在Linux上运行良好,但在Windows上失败?

由于进程或线程的默认堆栈大小取决于系统:

  • 在Windows上,链接器使用的默认堆栈保留大小为1 MB。
  • 在Linux / Unix上,可以通过ulimit命令配置最大堆栈大小。 另外,您可以在创建新线程时配置堆栈大小。
  • 因为在linux上的malloc实现我认为是不可靠的,因为即使内存不可用,它也可以返回一个非空指针。

    我想你说的是过度使用问题。 为了克服这个问题,你可以使用calloc并检查返回值。 如果您在应用程序的一开始就这样做,则可以立即退出,并显示相应的错误消息。

    链接地址: http://www.djcxy.com/p/28343.html

    上一篇: Stack overflow silenced on linux?

    下一篇: Where in memory are my variables stored in C?