我试图了解如何通过引用传递结构以创建链接列表。我使用的方法类似于下面给出的示例代码。但是,运行此代码时,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;
}
}
答案 0 :(得分:2)
在addNode
函数中,指针tester
不再指向tester
中main
指向的位置。功能并将您的功能更改为
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);
。现在*tester
是tester
中main
的别名。
答案 1 :(得分:1)
您将malloc
返回的指针保存为结构:
struct test example = malloc(sizeof(struct test));
也许您希望将其存储为指向struct的指针,以便example
和tester
具有匹配的类型:
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);