繁体   English   中英

链表/ C中的分段错误

[英]Segmentation fault in Linked list /C

我想从我的链表中删除最后一项,但是变成了分段错误。 所以一些指针是错误的。 这是我的代码。

#include <stdio.h>
#include <stdlib.h>

struct listenElement{
    int wert;
    struct listenElement *next;
};
static  struct listenElement* anfang = NULL;
int removeElement(void) {
    if (anfang == NULL){     
        return -1;
    }
    else{
        int l = NULL;
        struct listenElement *p = anfang->next ;     
        if (p->next == NULL){
            l = p->wert;
            free(p);
            anfang->next = NULL;
        }
        else
        {
            while(p->next != NULL){
              anfang = p;
              p = p->next;
              l = p->wert;
              free(p);
            }
            anfang =p;
            anfang->next= NULL;
        }
        return l;
    }
}

注意一旦你在某个指针上调用free就无法访问该指针(内存也通过其他指针),这样做会调用未定义的行为 - 这是一个非法的内存指令,可以在运行时检测到可能导致 - 分段错误好:

以下代码错误:

while(p->next!=NULL){// <--+  you use `p` - that is invalid 
    anfang = p;    //      |
    p = p->next;   //      |
    l = p->wert;   //      |
    free(p);//-------------+  you free `p`
}

另外学习缩进C程序

你的代码中还有一些错误:

  1. 逻辑不正确,当只有一个节点存在时,您不会考虑这种情况。 你需要添加,

      // this first pice of code to add // Case-1: when nodes in linked list are = 1 if (anfang->next == NULL){ free(anfang); anfang = NULL; reset to NULL return 1; // as you returns } 
  2. 你可以改进循环,并且在循环和循环之后使用anfang是错误的。 anfang应该总是指向第一个节点,你只需要删除最后一个节点。 如果链表中有多个节点,那么anfang值不会改变(读取注释):

      // this code should be after above code // Case-2: when nodes in linked list are > 1 p = anfang; // last = anfang->next; // last node // a loop for travel to reach - last node in linked list while(last->next != NULL){//stop when last - points to last node p = last; // every time before update last make `p` the `last` last = last->next; } p->next = NULL; // make `p` as last node, to remove last node free(last); // free memory for last node 

从逻辑上讲,你错了,在你的代码中你可以在while循环中自由调用,而你的目标是只删除一个 - 最后一个节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM