首次遇到Segmentation fault(段错误??)

http://baike.sogou.com/baike/fullLemma.jsp?max=&lid=54816111&fromTitle=%E6%AE%B5%E9%94%99%E8%AF%AF

 

出现了Segmentation fault,基本上的原因是,非法的内存访问。
例如数组的越界,在循环操作时循环变量的控制问题,也有字符串拷贝时长度溢出,指针指向了非法的空间,还有就是申明一个指针,但却没有对其初始化,就直接引用,或者没有开辟内存空间就释放内存,所以要检查申请空间时间是否成功。。。

百度含义:

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

中文名段错误

常见形式访问系统数据区等

含    义访问的内存超出了系统内存空间

性    质一个48位的寄存器

 

一旦一个程序发生了 越界访问, cpu就会产生相应的保护,于是segmentation fault就出现

了通过上面的解释,段 错误应该就是访问了不可访问的 内存,这个 内存区要么是不存在的,

要么是受到系统保护的,还有可能是缺少文件或者文件损坏。

段错误的常见形式

听语音

在 编程中以下几类做法容易导致段 错误,基本上是错误地使用 指针引起的。

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

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

解决方法:我们在用C/C++语言写程序的时候,内存管理的绝大部分工作都是需要我们来做的。实际上, 内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难免会在此处犯些小 错误,而通常这些错误又是那么的浅显而易于消除。但是手工“除虫”(debug),往往是效率低下且让人厌烦的,本文将就"段错误"这个内存访问 越界的错误谈谈如何快速定位这些"段错误"的语句。

几种典型的段错误

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;

}

无限递归,这会导致栈溢出,也会产生段错误。

posted @ 2017-07-13 15:05  星海violet  阅读(329)  评论(0)    收藏  举报