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

当硬件告诉操作系统一个有问题的内存引用时,就会产生这种错误。操作系统通过向出错的进程发送一个信号与之交流。信号即一种事件通知或者一个软件中断,在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);
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT技术猿猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值