C - 链表无法将节点**转换为节点*

C - linked list cannot convert node** to node*

我正在研究链表并准确地复制我的考官笔记,但无法让它发挥作用。错误说我

cannot convert 'node**' to 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;

}

你的问题就在这里

n1->next = &n2;

改为

n1->next = n2;

这背后的原因是,涉及的变量类型。 n1->next 属于 struct node * 类型,因此 n2&n2 将是 struct node **

类型

然而,这个指令仍然是错误的[并且你的程序/代码片段产生 undefined behaviour],因为 n1n2 都被初始化到这一点。 注意

  • 使用malloc()[或家庭]
  • n1n2分配内存
  • 至少考虑将 n1n2temp 初始化为 NULL[以及所有其他局部变量,就此而言]。

注:相关阅读,

  • 对于 temp = n1; 中的先读后写和使用未初始化的内存 n1->number

来自第 6.7.8 章第 10 段,C99 标准

If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.

和 , Annex J 同一个文档,来自 J.2

The value of an object with automatic storage duration is used while it is indeterminate

主要问题在于声明:

n1->next = &n2;

这里,n->next的类型是node*(看struct node的定义,你会发现它有一个成员next的类型是struct node*),然而,您正在为其分配 &n2,这是指向 n2 的指针。 n2本身是指向struct node类型的指针变量,因此,&n2是指向struct node类型的指针。

这会导致类型不匹配,从而导致错误。

其他问题是 n2 分配给 n1->next 时未初始化,n1 分配给 temp 时未初始化。