列表编译,但给出警告:不兼容的指针类型

List compiles, but gives warning: incompatible pointer type

#include<stdio.h>
#include<stdlib.h>

typedef struct
{
    int number;
    struct player *next;
}player;

player *newPlayer;
player *firstPlayer;
player *currentPlayer;

int main(void)
{
    newPlayer = malloc(sizeof(player));
    firstPlayer = newPlayer;
    currentPlayer = newPlayer;
    currentPlayer->next = NULL;
    printf("Please enter Head: ");
    scanf("%d", &currentPlayer->number);

    newPlayer = malloc(sizeof(player));
    currentPlayer->next = newPlayer;
    currentPlayer = newPlayer;
    currentPlayer->next = NULL;
    printf("Please enter second element: ");
    scanf("%d", &currentPlayer->number);


    currentPlayer = firstPlayer;
    while (currentPlayer)
    {
        printf("%d ", currentPlayer->number);
        currentPlayer = currentPlayer->next;
    }
    printf("\n");


}

代码编译正确,但我收到这些警告:
警告:来自不兼容指针类型的赋值 [-Wincompatible-pointer-types]
currentPlayer->next = newPlayer;

警告:来自不兼容指针类型的赋值 [-Wincompatible-pointer-types]
currentPlayer = currentPlayer->next;
为什么会这样,我该如何解决?
提前谢谢你:)

在此 typedef 声明中

typedef struct
{
    int number;
    struct player *next;
}player;

声明了两种类型。第一个是未命名的结构,其类型定义名称为 player.

typedef struct
{
    //...
}player;

第二种类型是未命名结构定义中声明的不完整类型struct player

    struct player *next;

指针类型 struct player *player * 是两种不兼容的不同类型。

所以对于像这样的语句

currentPlayer->next = newPlayer;

编译器会报错,因为左边有一个类型为 struct player * 的对象,而右边有一个类型为 player * 的对象。

你应该写

typedef struct player
{
    int number;
    struct player *next;
}player;

注意没有必要在文件范围内定义这些指针

player *newPlayer;
player *firstPlayer;
player *currentPlayer;

每个变量都应该在使用它的最小范围内声明。所以这些指针可以在函数 main 中声明。

定义结构时,您省略了结构名称。通过这样做,您实际上创建了一个 generic 结构,它只能通过它的 typedef(别名)来引用。

typedef struct
{
    int number;
    struct player *next;
} player;

在此定义中,player 只是此通用结构的别名。

要解决这个问题,请将单词 player 添加到第一行:

typedef struct player
{
    int number;
    struct player *next;
} player_t;

现在,您可以通过 struct playerplayer_t.

引用该结构

永远记住关键字 typedef 只是为了我们这些程序员的可读性。不要指望它做一些额外的工作。

编辑:如评论中所述,可以使用 typedef struct player player 并通过 struct player 或简单的 player.

引用结构