值传递结构的值不会更改

时间:2014-06-17 22:56:38

标签: c pointers struct linked-list pass-by-value

我试图了解如何通过引用传递结构以创建链接列表。我使用的方法类似于下面给出的示例代码。但是,运行此代码时,main函数中声明的* tester始终保持为NULL。以这种方式将结构传递给addNode()函数是不合适的(编译器不会引发任何警告)?

struct test{
  int num;
  struct test *next;
};
void addNode (int num, struct test* tester);

int main (void){
  struct test *tester = null;
  addNode(1, tester);
}

void addNode(int num, struct test* tester){
  struct test *example = malloc(sizeof(struct test));
  example->num = num;
  if (tester == NULL){
    tester = example;
  } else{
    tester->next = example;
  }
}

3 个答案:

答案 0 :(得分:2)

addNode函数中,指针tester不再指向testermain指向的位置。功能并将您的功能更改为

void addNode(int num, struct test** tester){
    struct test *example = malloc(sizeof(struct test));
    if (NULL == example )
         exit(0);        // Not enough memory

    example->num = num;  
    if (NULL == *tester)
         *tester = example; 
    else
        (*tester)->next = example;
}  

将此功能从main调用为addNode(1, &tester);。现在*testertestermain的别名。

答案 1 :(得分:1)

您将malloc返回的指针保存为结构:

struct test example = malloc(sizeof(struct test));

也许您希望将其存储为指向struct的指针,以便exampletester具有匹配的类型:

struct test* example = malloc(sizeof(struct test));

然后,这是有道理的:

tester = example;

答案 2 :(得分:1)

首先,您要为您的输入分配NULL。这样:

if (tester = NULL)

应该是

if (tester == NULL)

其次,在同一分支中,您为tester分配一个新值。但是,C中的所有内容都是通过值(复制)传递的,因此您的函数会收到指针的副本。因此,您只是在改变函数的本地副本。你需要另一层次的间接:

#include <assert.h>

struct test{
  int num;
  struct test *next;
};

void addNode (int num, struct test* tester);

int main (void){
  struct test *tester = NULL;
  addNode(1, &tester);
}

void addNode(int num, struct test** tester){
  / * wrong, check next item */
  assert(tester != NULL);

  struct test example = malloc(sizeof(struct test));
  example->num = num;
  if (*tester == NULL){
    *tester = example;
  } else{
    (*tester)->next = example;
  }
}

最后,malloc返回void*,可以隐式转换为任何其他类型的指针。但它不会返回“实例”。所以这是错误的:

struct test example = malloc(sizeof(struct test));

应该是:

struct test *example = malloc(sizeof *example);