段错误(segmentation fault)

段错误是由于内存管理异常,常由未初始化或非法指针引用引起。常见原因包括解除引用非法或空指针、访问权限错误以及堆栈或堆空间耗尽。编程错误如坏指针值、改写错误和重复释放内存是导致段错误的主要源头。正确管理和检查指针,避免超出边界访问和多次释放同一内存,能有效防止段错误。

段错误或段违规(segmentation fault)

段错误是由于内存管理单元的异常所致,而该异常则通常是由于解除引用一个未初始化或非法值得指针引起的,如果指针引用一个并不位于你的地址空间中的地址,操作系统便会对此进行干涉。一个小型的会引起段错误的程序如下:

int  *p = 0;

*p = 17;

一个微妙之处是导致指针具有非法的值通常是由于不同的变成错误所引起的。

通常导致段错误的几个直接原因:

1. 解除引用一个包含非法值得指针。

2. 解除引用一个空指针(常常由于从系统程序中返回空指针,并为经检验就使用)。

3. 在为得到正确的权限时进行访问。例如,试图往一个只读的文本段存储值就会引起段错误。

4. 用完课堆栈或堆空间(虚拟内存虽然巨大但绝非无限)。

以发生频率为序,最终可能导致段错误的常见编程错误是:

1. 坏指针值错误:在指针赋值之前就用它来引用内存,或者向库函数传送一个坏指针,第三种可能导致坏指针的原因是对指针进行释放之后再访问它的内容。可以修改free语句,在指针释放之后再将它置为空。

free(p); 

p = NULL;

2. 改写错误:越过数组便捷写入数据,在动态分配的内存两端之外写入数据,或改写一些堆管理数据结构。

例如:

p = malloc(256);

p[-1] = 0;

p[256] = 0;

3. 指针释放引起的错误:释放同一个内存块两次,或释放一块未曾使用的malloc分配的内存,或释放任再使用中的内存,或释放一个无效的指针,一个极为常见的与释放内存有关的错误就是在for(p = start; p; p = p->next)这样的循环中迭代一个链表,并在循环体内使用free(p)语句,这样在下一次循环迭代时,程序就会对已经释放的指针进行解除引用操作,从而导致不可预料的结果。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值