栈溢出,就是说栈的空间已经不够了。
什么时候会用到栈的空间呢?一般的指令不可能把栈搞到溢出。通常是局部变量和函数调用(函数参数和返回地址)会占用栈的空间。
就我个人的经验而言,栈溢出不过三种情形:
-- 如果开一个很大的局部变量,会造成栈溢出
#include <string.h>
#include <stdio.h>
int main()
{
int a [10 * 1024 * 1024];
a[0] = 1;
return 0;
}
上面的代码运行就会报段错误。
原因:
ulimit -s
10240
可以看到linux配置的线程栈的大小为10M。
函数里面使用了两个大的数组,超出了linux线程栈大小配置的上限,而函数调用是需要栈的,当空间不足,导致越界,所以core掉。所以在函数中劲量少使用大的数据,而是使用堆分配内存。
注意:
为什么加上a[0] = 1;才会core,不加是不会core呢
因为在linux中,只有在使用时候才会分配内存,如果没有a[0]=1;并不会在栈上为a数组分配内存,所以不会导致core掉。
-- 不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界
-- 如果函数无穷递归,也是会造成栈溢出的
查看函数栈的大小:
linux函数栈空间大小的shell命令是:ulimit -s
stack size (kbytes, -s) 8192
如果上8192,单位是KB,总共8M
修改函数栈的大小:
linux函数栈空间大小的shell命令是:ulimit -s 数字
函数栈发生错误的经典场景:
1、函数如果是递归函数,且函数内部包含较大的变量,那么非常容易栈溢出。
2、函数使用了某数组,数组大小由一个宏定义或常量指定,当后期代码升级的时候,加大了宏定义或常量的大小,导致原先的代码出现栈溢出。代码扩展性差。
参考:http://blog.youkuaiyun.com/xxm524/article/details/23601669