从 C 中的链表中弹出一个元素

Pop an element from a linked list in C

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

这是给定的骨架代码:

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;




}

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

得到它

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

newNode->name = name;

newNode->name = strdup(name);