访问结构值,更改结构值

时间:2019-03-25 00:17:18

标签: c pointers struct

当我遇到这个奇怪的问题时,我试图理解指针在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 随机数

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