C 取消引用指向结构的指针

C 取消引用指向结构的指针,c,pointers,data-structures,linked-list,singly-linked-list,C,Pointers,Data Structures,Linked List,Singly Linked List,我最近遇到了这个问题 创建了一个单链接列表,列表的节点如下所示 struct node { int data; struct node* link; }; 该列表是使用add at head创建的,该列表如下所示 100->200->300 显示函数写为 void display(struct node* head) { while(head != NULL) { printf ("%d", *head); head=head-&

我最近遇到了这个问题

创建了一个单链接列表,列表的节点如下所示

struct node
{
    int data;
    struct node* link;
};
该列表是使用add at head创建的,该列表如下所示

100->200->300

显示函数写为

void display(struct node* head)
{
    while(head != NULL)
    {
        printf ("%d", *head);
        head=head->next;
    }
}
这是访问列表中数据的合法方式吗?我将它与GCC编译器绑定在一起,它抛出了一个警告,但它起了作用。在某些情况下会导致错误吗

printf ("%d", *head);
应该是

printf ("%d", head->data);
然后编译器警告应该消失。你的代码是偶然工作的 (或者是意外,正如@alk所评论的) 因为
数据
结构节点的第一个成员
。这可能取决于结构参数的使用方式 传递给printf函数。无论如何,这是错误的

应该是

printf ("%d", head->data);
然后编译器警告应该消失。你的代码是偶然工作的 (或者是意外,正如@alk所评论的) 因为
数据
结构节点的第一个成员
。这可能取决于结构参数的使用方式
传递给printf函数。无论如何,这是错误的。

我通常使用head->data,这是在公司招聘过程中询问的,考虑到此测试是基于纸面的客观测试,我想知道答案是错误还是正确的输出。@user1276290:这取决于平台上使用的“呼叫约定”。如果
*head
后面跟着更多的printf参数,它也可能会失败。在任何情况下,使用未定义行为的代码都是错误的。我通常使用head->data,这是在公司招聘过程中询问的,考虑到此测试是基于纸面的客观测试,我想知道答案是错误还是正确的输出。@user1276290:这取决于平台上使用的“调用约定”。如果
*head
后面跟着更多的printf参数,它也可能会失败。在任何情况下,使用未定义行为的代码都是错误的。警告是什么?(为了清楚起见,答案强调了问题所在,但警告应该包含在这个问题中。警告可能会帮助未来的用户找到问题和答案,并且,一旦添加到问题中,可能会发现关于数据结构和(单独)的标签对于这个问题,链表可能并不那么重要。)警告是什么?(为了清楚起见,答案强调了问题所在,但警告应该包含在这个问题中。警告可能会帮助未来的用户找到问题和答案,并且,一旦添加到问题中,可能会发现关于数据结构和(单独)的标签对于这个问题,链表可能并不那么重要。)