segmentation fault/violation --段错误/违规

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baobingji/article/details/84948247

当硬件告诉操作系统一个有问题的内存引用时,就会产生这种错误。操作系统通过向出错的进程发送一个信号与之交流。信号即一种事件通知或者一个软件中断,在NUIX系统编程中使用广泛,但在应用程序编程中几乎不使用。在缺省的情况下,进程在收到“段错误”信号后将进行信息转储并终止。
一个小型的引起段错误的程序如下:

int *p=NULL;
*p=17;/*此处将引起一个段错误*/

通常导致段错误的几个直接原因:
(1)解除引用一个包含非法值的指针;
(2)解除引用一个空指针(常常由于从系统中返回空指针,并未检查就使用);
(3)在未得到正确的权限时进行访问:例如试图往一个只读文本段存储值就是引起段错误;
(4)用完了堆栈或堆空间。

常见编程中可能导致段错误的陷阱:
(1)坏指针错误:在指针赋值之前就用其来引用内存;或者向库函数传送一个坏指针;或在对指针释放之后再去访问它所指向的内存,这种情况下可以修改free语句:free(q);q=NULL;
(2)改写(overwrite)错误:越过数组边界写入数据;或在动态分配的内存两端之外写入数据;或改写一些堆管理数据结构(动态分配的内存之前的区域写入数据就很容易发生段错误);
(3)指针释放引起的错误:释放同一个内存块两次(这种情况下有可能会报double free错误);或释放一块未曾使用malloc分配的内存;或释放仍在使用中的内存;或释放一个无效的指针。

for(p=start;p;p=p->next)
{
	free(p);
}

上例所示:程序在下一次循环迭代时,会对已经释放的指针进行解除引用操作,从而导致段错误。

猜你喜欢

转载自blog.csdn.net/baobingji/article/details/84948247