我正在研究链表并准确复制我的考官笔记,但无法让它工作。错误说我
无法将"节点**"转换为节点*"。
我尝试更改类型以使它们匹配,但这只会导致它在运行后崩溃。如果有人能给我一些关于为什么会发生这种情况的见解,将不胜感激。
#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;
}
你的问题就在这里
n1->next = &n2;
更改为
n1->next = n2;
这背后的原因是所涉及的变量的类型。 n1->next
是struct node *
型,所以n2
。 &n2
将属于struct node **
类型
但是,此指令仍然是错误的[并且您的程序/代码片段会产生未定义的行为],因为到目前为止,n1
和n2
都是单元化的。注意
- 为
n1
分配内存,n2
使用malloc()
[或系列] - 至少考虑初始化
n1
、n2
、temp
NULL
[以及所有其他局部变量,就此而言]。
注:相关阅读材料,
- 用于
temp = n1;
先读后写和使用未初始化内存n1->number
从第6.7.8章第10段开始,C99
标准
如果未显式初始化具有自动存储持续时间的对象,则其值不确定。
和 ,Annex J
同一文档,来自J.2
具有自动存储持续时间的对象的值在 定
主要问题在于以下语句:
n1->next = &n2;
在这里,n->next
是类型node*
(请参阅结构节点的定义,您会发现它有一个成员next
具有类型struct node*
),而您正在为其分配&n2
,这是一个指向n2
的指针。 n2
本身是指向struct node
类型的指针变量,因此,&n2
是指向struct node
类型的指针。
这会导致类型不匹配,从而导致错误。
其他问题是n2
在分配给n1->next
时没有初始化,n1
在分配给temp
时没有初始化。