我正在研究链接列表并完全复制我的审查员注释,但无法使其工作。错误说我
无法将'node **'转换为node *'。
我已经尝试更改类型以便它们匹配,但这只会导致它在运行后崩溃。如果有人能够让我深入了解为什么会发生这种情况,我将不胜感激。
#include <stdlib.h>
struct node
{
int number;
struct node *next;
}*head;
main(){
int i;
node *n1, *n2, *temp;
temp = n1;
n1->number = 1;
n1->next = &n2;
n2->number = 2;
n2->next = NULL;
return 0;
}
答案 0 :(得分:2)
你的问题在这里
n1->next = &n2;
更改为
n1->next = n2;
这背后的原因是,所涉及的变量类型。 n1->next
的类型为struct node *
,n2
为&n2
。 struct node **
类型为n1
然而,这条指令仍然是错误的[并且您的程序/代码段会生成undefined behaviour],因为n2
和n1
都是一致的,直到此时为止。 注
n2
[或家庭] malloc()
,n1
分配内存
n2
,temp
,NULL
初始化为temp = n1;
[以及所有其他本地变量]。注意:相关读物,
n1->number
中的先读后读和使用未经初始化的内存C99
从第6.7.8章第10段Annex J
标准
来自如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。
J.2
的同一文档的和{{1}}
使用具有自动存储持续时间的对象的值 不确定
答案 1 :(得分:2)
主要问题在于声明:
n1->next = &n2;
此处,n->next
的类型为node*
(请参阅struct node的定义,您会发现它的成员next
的类型为struct node*
),而,您正在为其分配&n2
,这是指向n2
的指针。 n2
本身是类型struct node
的指针变量,因此&n2
是指向struct node
类型指针的指针。
这会导致类型不匹配,从而导致错误。
其他问题是n2
在将n1->next
分配给n1
时未初始化,temp
在将其分配给{{1}}时未初始化。