日期:2014-05-16  浏览次数:20567 次

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