”段”(segmentation)是指二进制文件内的区域,所有某种特定类型信息被保存在里面。可以用size程序得到可执行文件中各个段的大小。如刚才的factorial.c,编译出a.exe以后执行size的结果是:
D:\>size a.exe
text data bss dec hex filename
2756 740 224 3720 e88 a.exe
在可执行文件中,正文段(Text Segment)用于储存指令,数据段(DataSegment)用于储存已初始化的全局变量,BSS段(BSS Segment)用于储存未赋值的全局变量所需的空间。
调用栈并不存在与可执行文件中,而是在运行时创建。调用栈所在的段成为堆栈段(Satck Segmentation)。和其他段一样,堆栈段也有自己的大小,不能被越界访问,否则就会出现段错误。
如果递归的次数多了,就会出现堆栈段越界的情况,这种情况叫做栈溢出。建议把较大的数组放在main函数外也是这个原因,因为局部变量也是放在堆栈段的。(堆栈段存放递归调用时,上一个函数的返回地址 以及局部变量)。
栈溢出不一定是递归调用太多,也可能是局部变量太大,总大小超过了允许的范围。