我想使用结构和内存分配创建一个整数链表。我得到的这个错误对我来说并没有多大意义。据我所知,如果你的指针ptr
指向一个变量为x
的结构作为其元素,则*(ptr).x
相当于ptr->x
。但是,这里的行为是不同的:
typedef struct
{
int data;
struct node * next;
}node;
//create a pointer to a new node containing the entered value
node * newNode(int data)
{
//create new node and a pointer to it
node next;
node * ptr;
next.data = data;
ptr = malloc(sizeof(node));
*(ptr) = next;
return ptr;
}
static node * head;
int main()
{
//my goal here is to start creating a linked list with values 1,2,3,4 respectively.
node * currentNode;
head = newNode(1);
*(head).next = newNode(2);
}
如果我编译这段代码,我会得到一个关于下一个不是结构成员的错误。然而,
当我用*(head).next = newNode(2)
替换head->next = newNode(2)
时,我只收到有关指针类型不兼容的警告。我不明白这里的行为差异和错误来源。感谢您的帮助。
答案 0 :(得分:3)
.
的优先级高于*
,因此第二个表达式head->next
相当于(*head).next
,而不是*(head).next
。
关于您的第二个错误,那是因为您的struct
声明缺少标记。您实际上是在声明匿名struct
,然后typedef
将其声明为node
。这是一个更正的声明,它消除了不兼容的指针警告。
typedef struct node
{
int data;
struct node * next;
} node;
最后,您的newNode
功能可以简化如下,使用NULL
的标准库标题。
#include <stdlib.h>
//create a pointer to a new node containing the entered value
node * newNode(int data)
{
node * ptr;
ptr = malloc(sizeof(node));
ptr->data = data;
ptr->next = NULL;
return ptr;
}
答案 1 :(得分:1)
假设:
node *head;
之间存在巨大差异:
*(head).next
和
(*head).next
第一个是不正确的;它等同于*head.next
或*(head.next)
,但head
是指针,而不是结构,因此无法使用.
表示法。
第二个是正确的版本,相当于head->next
。
成员访问操作符.
和->
绑定非常紧密,比*
更紧密。行为是运算符优先级的简单结果。
您的newNode()
函数应确保新节点已完全初始化。它应该在分配给next.next = 0;
之前设置next.next = NULL;
(或*ptr
) - *(ptr)
中的括号完全是多余的。