读书人

linux的线程栈大小的限制导致的段异常

发布时间: 2013-11-13 14:04:18 作者: rapoo

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函数中申请大的数组,不然很容易出问题。

读书人网 >UNIXLINUX

热点推荐