使用数组创建单向链表时需要注意的警告信息

3
#include <stdio.h>

typedef struct
{
  int data;
  struct node *next;
}node;

void print(node *head)
{
  node *tmp = head;
  while (tmp)
  {
    printf ("%d ", tmp->data);
    tmp = tmp->next;
  }
}

int main()
{
  node arr[5] = {
                  {1, &arr[1]},
                  {2, &arr[2]},
                  {3, &arr[3]},
                  {4, &arr[4]},
                  {5, NULL}
                };

  print(arr);
  return 0;
}

为什么我在使用gcc -Wall编译时会出现这些警告?(即使没有使用-Wall选项,gcc也会产生相同的警告)

list.c: In function ‘print’:
list.c:15:7: warning: assignment from incompatible pointer type [enabled by default]
list.c: In function ‘main’:
list.c:22:18: warning: initialization from incompatible pointer type [enabled by     default]
list.c:22:18: warning: (near initialization for ‘arr[0].next’) [enabled by default]
list.c:23:18: warning: initialization from incompatible pointer type [enabled by default]
list.c:23:18: warning: (near initialization for ‘arr[1].next’) [enabled by default]
list.c:24:18: warning: initialization from incompatible pointer type [enabled by default]
list.c:24:18: warning: (near initialization for ‘arr[2].next’) [enabled by default]
list.c:25:18: warning: initialization from incompatible pointer type [enabled by default]
list.c:25:18: warning: (near initialization for ‘arr[3].next’) [enabled by default]
2个回答

6

@metalhead所说的是正确的。另一种可能更好的实现相同效果的方法是

typedef struct _node
{
  int data;
  struct _node *next;
} node;

在这个定义之后,node(没有下划线)可以像 int 一样作为类型名称简单使用。

P.S. 下划线只是一种标准惯例,而不是必须的。任何名称都可以用来代替_node,只要你在两个位置都替换即可。然而,在 C 中,这是一种约定俗成的编码习惯,有助于开发人员快速理解 _node 实际上是指节点类型。


3

你试图在定义node时使用struct node,因此编译器不知道你想让它们成为同一件事。尝试先前声明结构体:

struct node;
struct node
{
  int data;
  struct node *next;
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接