这个简单的代码(向链表添加元素并打印它)工作正常
#include <stdio.h>
struct node{
int item;
struct node* next;
};
void print_node (struct node* n){
while (n!= NULL){
printf("%d ", (*n).item);
n = n->next;
}
printf("\n");
}
void append_node(struct node *list, struct node *n){
while(list->next != NULL)
list = list->next;
list->next = n;
}
int main(){
struct node n1, n2;
n1.item = 1;
n1.next = NULL;
n2.item = 2;
n2.next = NULL;
print_node(&n1);
print_node(&n2);
append_node(&n1,&n2);
print_node(&n1);
printf("done\n");
return 0;
}
如果我将append_node定义为以下
void append_node(struct node *list, struct node n){
while(list->next != NULL)
list = list->next;
list->next = &n;
}
并在main中相应地调用它(即append_node(&n1, n2)
)运行程序时出现分段错误。我不明白为什么:)
答案 0 :(得分:1)
当您致电append_node(struct node *list, struct node n)
时,参数n
将复制到函数上下文中。
当函数离开时,将释放上下文,并且数据的副本n
将丢失。
如果您在将append_node(struct node *list, struct node n)
(使用n
)复制到链接列表之前,可以使用您的函数malloc
。
修改的
这可能会对您有所帮助:What's the difference between passing by reference vs. passing by value?