从C中的链接列表中弹出元素

时间:2015-07-29 22:46:16

标签: c pointers linked-list

我一直试图从链接列表中弹出一个元素,但我得到了这个奇怪的输出。

这是给定的骨架代码:

char* pop() {

}

这就是我现在所拥有的:

char* pop() {
  char* val;
  struct node* current;

  if( head != NULL){   
        val = head -> name;
        current = head -> next;
        free(head);
        head = current;
    }

  return(val);
}

这是main.c:

node *head = NULL; //globally accessible

int main(){
        printf("Printing an empty list\n");
        print_list();

        printf("\nPushing Kelsier...\n");
        push("Kelsier");
        print_list();

        printf("\nPushing Vin. Should be: Vin Kelsier\n");
        push("Vin");
        print_list();
        char* vin = pop();
        free(vin);
        pop();

        print_list();

这是奇怪的输出:

*** glibc detected *** ./linked_list: munmap_chunk(): invalid pointer: 0x000000000040098d ***

此行之后是一些奇怪的东西和文件夹路径

事情是程序在没有这两行的情况下工作:

char* vin = pop();
free(vin);

当我只用pop();替换它们时,但是给出了这两行,我不应该这样做。

这是推动:

void push(char *name) {

        struct node* newNode;
        newNode =  malloc (sizeof (struct node));
        newNode->name = name;
        newNode->next = head;
        head = newNode;




}

1 个答案:

答案 0 :(得分:0)

pop返回传递给push的相同指针:字符串文字"Vin"的地址。你不能free字符串文字,因为你没有从malloc获得它。

如果pop返回的值应该是free,那么push必须分配一个字符串,而不是仅仅复制一个指针。例如,您可以替换

newNode->name = name;

newNode->name = strdup(name);