【转】段错误含义及实例

百科名片

所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gd tr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的 gdt表,后13位保存 相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向 的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起 始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。


补充
一旦一个程序发生了 越界 访问, cpu 就会产生相应的保护,于是segmentation fault就出现 了通过上面的解释,段 错误 应该就是访问了不可访问的 内存 ,这个内存区要么是不存在的, 要么是受到系统保护的,还有可能是缺少文件或者文件损坏。寻找程序安装维修按列。编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的。

1)访问系统数据区,尤其是往系统保护的内存地址数据最常见就是给一个指针以0地址。

2)内存越界(数组越界,变量类型不一致等): 访问到不属于你的内存区域。


几种典型的段错误

  1,int main(void){
  char*s ="hello world";
  *s ='H';
  }
  被装载时,系统把“hello world” 连同其它的字符串和const型数据放入到内存的只读区。执行时,一个变量s被设为指向该字符串的位置,当再试图向该位置写时,就会产生段错误。
  2,
  int*ptr = NULL;
  *ptr =1;
  因为该代码只创建了一个空指针,并没有指向一个具体空间,当赋值时,产生段错误。
  3,
  int main(void){
  main();
  return0;
  }
  无限递归,这会导致栈溢出,也会产生段错误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值