Segmentation fault报错(网上搜索总结归纳).doc

Segmentation fault报错(网上搜索总结归纳).doc

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Segmentation fault报错      从字面上来翻译叫做分段错误.这个错误是由于访问了非法内存地址而引起的,因此,产生这个错误的原因就可能是以下几种:   1,数组越界.   这个很好理解,就是本来只定义了一个char s[10]的数组,却在程序中访问了s[10].当然在程序中若出现问题是不可能这么显而易见的.   2,访问空,野指针或未被初始化的指针.   空指针是指值为NULL的指针,不指向任何内存;   野指针是指值不确定的指针,指向不确定的内存;   未被初始化的指针和野指针一样,其值是不确定的.      用一个处理文件的例子来说明:   这个程序是想计算文件中有多少行含有字符#   #include   /*假定文件的每一行最大长度不超过300*/   #define BUFF_LINE 300      int main()   {    char FileCont[BUFF_LINE];    char* str=FileCont;    int couter=0;    FILE* fp;    if ( (fp = fopen( file_refer.cfg, r ) ) == NULL)    {    printf( File could not be opened\n );    exit(0);    }    fgets(str,BUFF_LINE,fp);    while(!feof(fp))    {    /*处理每一行*/    while(*str!=\0)    {    if (*str==#)    {    couter++;    break;    }    else    str++;    }    fgets(str,BUFF_LINE,fp);    }    fclose(fp);    printf(%d,couter);    return 0;   }      这个程序看起来没什么问题,而且很有可能运行正确(当文件小的情况下),可是一旦文件长度超过300的时候,就可能会出问题了.300?不是定义的允许一行的长度么?怎么变成文件长度了?原因在于在处理一行之后,并没有将指针str的值重置为数组FileCont的开始.而是指向了FileCont加上若干长度的地址(一行的长度或者是到一行开始到#的长度).这样一旦文件的行数很多,总长度很长,那么str就会越过数组的边界访问非法的内存地址.      黑客技术中有一种缓冲区溢出攻击,就是应用的这个原理,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。 段错误 一般都是非法内存操作,例如数组越界,例如申请a[5],却访问到a[5]或者a[6],这也会有很多情况,可能是循环操作时循环变量控制有问题,可能是字符串拷贝时长度发生溢出 指针指向了非法内存,例如申明一个指针,但是没有对指针进行初始化,直接就引用,或者引用里面的元素或者函数,或者没有分配内存就进行释放等,另外,申请内存还要检查是否申请成功,如果没有申请成功也会出现这种情况 单步调试或者加打印信息,细心一点总可以找到错误的,注意编译成调试版本 如果是linux,可以产生core文件,从core文件查看出错的地方 /blog/article.php?tid_700.html 用户名: 密? ?码: 1? 最 可恶的Segmentation faults之初级总结篇 作者: falcon ? 发表日期: 2006-09-27 15:20 ? \o /blog/article.php?tid_700.html 复制链接 背景 ??? 最近一段时间在linux下用C做一些学习和开发,但是由于经验不足,问题多多。而段错误就是让我非常头痛的一个问题。不过,目前写一个一千行左右的代码,也很少出现段错误,或者是即使出现了,也很容易找出来,并且处理掉。 ??? 那什么是段错误?段错误为什么是个麻烦事?以及怎么发现程序中的段错误以及如何避免发生段错误呢? ??? 一方面为了给自己的学习做个总结,另一方面由于至今没有找到一个比较全面介绍这个虽然是“FREQUENTLY ASKED QUESTIONS”的问题,所以我来做个抛砖引玉吧。下面就从上面的几个问题出发来探讨一下“Segmentation faults吧。 目录 1。什么是段错误? 2。为什么段错误这么“麻烦”? 3。编程中通常碰到段错误的地方有哪些? 4。如何发现程序中的段错误并处理掉? 正文 1。什么是段错误? 下面是来自A的定义: A segmentation fault (often short

文档评论(0)

yurixiang1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档