从 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);
我一直试图从链表中弹出一个元素,但我得到了这个奇怪的输出。
这是给定的骨架代码:
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);