【转】段错误含义及实例

百科名片

所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由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;
  }
  无限递归,这会导致栈溢出,也会产生段错误。

你可能感兴趣的:(其他)