现在的位置: 首页 > 综合 > 正文

段错误与栈溢出

2013年07月11日 ⁄ 综合 ⁄ 共 535字 ⁄ 字号 评论关闭

读书笔记:《算法竞赛入门经典》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函数外”。因为栈溢出可能由局部变量太大引起。

 

抱歉!评论已关闭.