linux的线程栈大小的限制导致的段错误


#include <string.h>
#include <stdio.h>

int main()
{
int a [10 * 1024 * 1024];
a[0] = 1;
return 0;
}

上面的代码运行就会crash。
原因:
ulimit -s

10240
可以看到linux配置的线程栈的大小为10M。
函数里面使用了两个大的数组,超出了linux线程栈大小配置的上限,而函数调用是需要栈的,当空间不足,导致越界,所以core掉。所以在函数中劲量少使用大的数据,而是使用堆分配内存。

为什么加上a[0] = 1;才会core,不加是不会core呢

因为在linux中,只有在使用时候才会分配内存,如果没有a[0]=1;并不会在栈上为a数组分配内存,所以不会导致core掉。
可以使用pmap工具来查看地址空间的分配状况。
附:使用inline时,最后不要在inline函数中申请大的数组,不然很容易出问题。

[color=white]作者:翁志艺[/color]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值