读书笔记:《算法竞赛入门经典》P66-67
“段”(Segment)是指二进制文件内的区域,所有某种特定类型信息被保存在这里。可以用size程序得到可执行文件中各个段的大小。
在可执行文件中:
正文段(Text Segment)储存指令;
数据段(Data Segment)储存已初始化的全局变量;
BSS段(BSS Segment)储存未复制的全局变量所需的空间。
调用栈并不储存在可执行文件中,而是在运行时创建。调用栈所在的段称为堆栈段(Stack Segment)。和其他段一样,它也有自己的大小,不能被越界访问,否则就会出现段错误(Segment Fault)。
在运行时,程序会动态创建一个堆栈段,里面存放着调用栈,因此保存着函数的调用关系和局部变量。
栈空间的大小和操作系统有关。在Linux中,由系统命令ulimit指定,例如ulimit -a显示当前栈大小,而ulimit -s 32768将把栈大小指定为32MB。但在Windows中,栈大小是储存在可执行文件的。使用gcc可以这样制定可执行文件的栈大小:gcc -WI,--stack=16777216,这样栈大小就变为了16MB。
数组的使用中,建议“把较大的数组放在main函数外”。因为栈溢出可能由局部变量太大引起。