当我遇到这个奇怪的问题时,我试图理解指针在c中的工作方式。
现在,我想建立一个链表。我做的第一件事是添加add函数。一旦函数将一个节点添加到列表的最后一个节点(成功完成)
typedef struct linkedLists{
int x;
struct linkedLists *next;
//int (*add)(int) = add;
}linkedList;
void addF(linkedList *l, int y){
linkedList adder = {.x=y};
l->next = &adder;
return;
}
int main(int argc, char** argv) {
linkedList list = {.x=2,.next=NULL};
printf("%d\n",list.x);
addF(&list,3);
printf("%d\n",list.x);
// If you comment this line the result changes to what it's
//expected
printf("%d\n",(*list.next).x);
return (EXIT_SUCCESS);
}
如果我跑步
printf("%d\n",(*list.next).x);
我得到3,这是理想的。但是,如果我运行
printf("%d\n",list.x);
printf("%d\n",(*list.next).x);
我得到: 2 随机数
答案 0 :(得分:1)
l->next
分配了一个指针值,一旦addF()
结束,该值将立即失效。结果:未定义的行为。
void addF(linkedList *l, int y){
linkedList adder = {.x=y}; // adder is local
l->next = &adder;
return;
}
更有意义的是遍历链表(假设它至少有一个节点)并追加一个新节点。
void addF_alt(linkedList *l, int y) {
while (l->next) {
l = l->next;
}
l->next = malloc(sizeof *(l->next));
if (l->next) {
l = l->next;
l->next = NULL;
l->x = y;
}
}
更常见的是通过功能附加 all 个节点。
TBD code
答案 1 :(得分:0)
此功能
void addF(linkedList *l, int y){
linkedList adder = {.x=y};
l->next = &adder;
return;
}
您泄漏了指向对象的指针(&adder),该对象的生命周期在函数返回时结束。您必须使用static
关键字
static linkedList adder = {.x=y};
或与malloc()
&co。动态分配空间。
Howeber,list.x
在两种情况下都应始终取值为2
。