浅析段错误和栈溢出

什么段

  我们在学习微机原理的时候就遇到过段,它代表在一个可执行文件中各种的类型信息存放的地方。
  正文段:text用于存储指令;
  数据段:data用于存储已初始化的全局变量;
  bss段:用来存放程序中未初始化或者初始化为0的全局变量和静态变量;
  堆栈段:stack和其他段一样有着自己的大小,一旦越界同样会爆段错误。它是在运行时,程序动态创建的一个堆栈段,放着调用栈,保存着函数调用关系和局部变量。

造成段错误的原因一般有如下三点:

1.内存访问出错
  这类问题的典型代表就是数组越界、变量类型不一致等。
2.非法内存访问
  这类问题主要是程序试图访问内核段内存而产生的错误。
3.栈溢出
  栈,就是用来描述函数之间的调用关系,它由多个栈帧组成,每个栈帧代表着对应运行的函数。栈溢出指的是对栈的使用超出的栈的大小。引起栈溢出的原因主要有二,一个是局部变量所占用的空间太大(解决方法:增大栈空间或者用动态分配,使用堆),二是函数的调用/递归次数太多或者无限调用。

典型的段错误:
	int main(void)
	{ 
		char*s ="hello world";
		*s ='H';
	}

  在程序被装载时,系统把“hello world” 连同其它字符串和const类型数据放入到内存的只读区域。在执行时,一个变量s被设为指向该字符串的位置,当再向该位置写时,就会产生段错误。

int main()
{
	int*ptr = NULL;
	*ptr =1;
}

  该代码仅仅创建了一个空指针,没有指向一个具体空间,当赋值时,找不到具体的空间,所以会产生段错误。

int main(void)
{
	int main();
	return 0;
}

  这个代码是很明显的无限递归,这会导致栈溢出,从而产生段错误。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值