我一直试图从链接列表中弹出一个元素,但我得到了这个奇怪的输出。
这是给定的骨架代码:
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;
}
答案 0 :(得分:0)
pop
返回传递给push
的相同指针:字符串文字"Vin"
的地址。你不能free
字符串文字,因为你没有从malloc
获得它。
如果pop
返回的值应该是free
,那么push
必须分配一个字符串,而不是仅仅复制一个指针。例如,您可以替换
newNode->name = name;
与
newNode->name = strdup(name);