linux下堆栈溢出实例,堆栈溢出在Linux上沉默?

在Linux上,我有一个代码,它使用在main函数内声明的数组,其中6e为1MB 1字节

#include

#include

#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上正常工作?万一它使用堆为什么我不需要免费呢?

解决方法:

Why does it run fine on Linux but fails on Windows?

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

Because malloc implementation on linux i think is not reliable because it can return a not null pointer even if memory is not available.

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

标签:c-3,linux,windows,stack

来源: https://codeday.me/bug/20190722/1507264.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值