c语⾔中常见的⼏个段错误
通常导致段错误的⼏个直接原因:
(1)解除引⽤⼀个包含⾮法值的指针
(2)解除引⽤⼀个空指针(常常由于从系统程序中返回空指针,并未检验就使⽤)
(3)在未得到正确的权限时进⾏访问。例如,试图往⼀个只读⽂本段存储值就会引起段错误
c语言中struct(4)⽤完了堆栈或堆空间(虚拟内存虽然巨⼤但绝⾮⽆限)
以发⽣频率为序,最终可能导致段错误的常见编程错误是:
1. 坏指针值错误: 在指针赋值之前就⽤它来引⽤内存,或者向库函数传送⼀个坏指针。第三种可能导致坏指针 的原因是对指针进⾏释放之后再访问它的内容。可以修改free语句。在指针释放之后再将它置为空值。
free(p); p = NULL;
这样,如果在指针释放之后继续使⽤该指针,⾄少程序能在终⽌之前进⾏信息转储。
2. 改写(overweight)错误: 越过数组边界写⼊数据,在动态分配的内存两端之外写⼊数据,或改写⼀些堆管 理数据结构(在动态分配的内存之前的区域写⼊数据)
p = malloc(256); p[-1] = 0; p[256] = 0;
3. 指针释放引起的错误: 释放同⼀个内存块两次,或释放⼀块未曾使⽤malloc分配的内存,或释放仍在使⽤中的 内存,或释放⼀个⽆效的指针。⼀个极为常见的与释放内存有关的错误就是在 for(p = start; p; p = p->next) 这样的循环中迭代⼀个链表,并在循环体内使⽤free(p)语句。这样,在下⼀次循环迭代时,程序就会对已经释放的指针进⾏解除引⽤操作,从⽽导致不可预料的结果。
那如何在链表中释放元素呢?
在遍历链表时正确释放元素的⽅法是使⽤临时变量存储下⼀个元素的地址。这样就可以安全地在任何时候释放当前元素,不必担⼼在取下⼀个元素的地址时还要引⽤它。代码如下:
struct node *p, *start, *tmp;
for(p = start; p; p = tmp){
tmp = p->next;
free(p);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论