我想使用结构和内存分配创建一个整数链表。我得到的这个错误对我来说没什么意义。据我所知,如果你有一个指针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);
}
如果我编译这段代码,我得到一个关于next不是结构体成员的错误。然而,当我用head->next = newNode(2)
替换*(head).next = newNode(2)
时,我只得到一个关于指针类型不兼容的警告。我不明白行为上的差异,也不明白错误的来源。
.
的优先级高于*
,因此第二个表达式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;
}
给定:
node *head;
*(head).next
和
(*head).next
第一个是错误的;它相当于*head.next
或*(head.next)
,但head
是指针,而不是结构体,因此不能使用.
表示法。
第二个是正确的版本,相当于head->next
。
成员访问操作符.
和->
绑定得非常紧密,比*
绑定得紧密得多。该行为是操作符优先级的简单结果。
您的newNode()
函数应该确保新节点完全初始化。它应该在分配给*ptr
之前设置next.next = 0;
(或next.next = NULL;
) - *(ptr)
中的括号完全是多余的。