繁体   English   中英

堆栈溢出在Linux上沉默?

[英]Stack overflow silenced on linux?

在Linux上我有一个代码,它使用在main函数内声明的数组,其中6e为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实现我认为不可靠,因为它可以返回非空指针,即使内存不可用。

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

有可能是Linux上运行的程序没有链接改变堆栈大小,但在运行时不像Windows那样失败,是否会默默地忽略堆栈问题?

另外,为什么如果我在主函数之外声明数组它在Windows上正常工作? 万一它使用堆为什么我不需要免费呢?

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

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

因为linux上的malloc实现我认为不可靠,因为它可以返回非空指针,即使内存不可用。

我想你在谈论过度使用问题 要解决此问题,您可以使用calloc并检查返回值。 如果在应用程序的最开始执行此操作,则可以立即退出并显示相应的错误消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM