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

时间:2015-02-03 07:20:05

标签: c pointers linked-list

我正在研究链接列表并完全复制我的审查员注释,但无法使其工作。错误说我

  

无法将'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;

}

2 个答案:

答案 0 :(得分:2)

你的问题在这里

n1->next = &n2;

更改为

n1->next = n2;

这背后的原因是,所涉及的变量类型。 n1->next的类型为struct node *n2&n2struct node **类型为n1

然而,这条指令仍然是错误的[并且您的程序/代码段会生成undefined behaviour],因为n2n1都是一致的,直到此时为止。

  • 使用n2 [或家庭]
  • malloc()n1分配内存
  • 至少考虑将n2tempNULL初始化为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}}时未初始化。