我有这段代码(希望)会成为单链表实现。
#include <stdio.h>
#include <stdlib.h>
struct NODE{
int d;
struct NODE *next;
};
int addNode(int n, struct NODE **root);
int main(){
struct NODE *root = NULL;
addNode(3, &root);
printf("%i\n", root->d);
getch();
return 0;
}
int addNode(int n, struct NODE **root){
if(*root == NULL){
*root = malloc(sizeof(struct NODE));
*root->d = n;
*root->next = NULL;
return 0;
}
}
当我运行它时,我在addNode函数内部得到“对于成员'd'的请求,而不是结构或联合”;与“下一个”部分相同。如果相反,我将功能更改为:
int addNode(int n, struct NODE **root){
struct NODE *temp;
if(*root == NULL){
*root = malloc(sizeof(struct NODE));
temp = *root;
temp->d = n;
temp->next = NULL;
return 0;
}
}
它运作得很好。我的问题是;为什么我要创造临时?据我了解,在代码的第一个版本中,我传递一个指向root的指针,因此不应该存在“按引用传递”的问题,并且它应该没有运行的问题......这是什么错误?
答案 0 :(得分:3)
(*root)->d = n;
(*root)->next = NULL;
它是运算符优先级问题。使用()
将解决此问题。
答案 1 :(得分:1)
运营商优先权。
*root->d = n;
被解析为
*(root->d) = n;
但你想要
(*root)->d = n;
答案 2 :(得分:0)
请参阅Operator Precedence Table。 ->
运算符的优先级高于*
(取消引用)运算符,这是导致错误的原因。
* root-&gt; d被解释为*(root-&gt; d)而不是(* root) - &gt; d。