列表编译,但给出警告:不兼容的指针类型
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", ¤tPlayer->number);
newPlayer = malloc(sizeof(player));
currentPlayer->next = newPlayer;
currentPlayer = newPlayer;
currentPlayer->next = NULL;
printf("Please enter second element: ");
scanf("%d", ¤tPlayer->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 player
或 player_t
.
引用该结构
永远记住关键字 typedef
只是为了我们这些程序员的可读性。不要指望它做一些额外的工作。
编辑:如评论中所述,可以使用 typedef struct player player
并通过 struct player
或简单的 player
.
引用结构
#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", ¤tPlayer->number);
newPlayer = malloc(sizeof(player));
currentPlayer->next = newPlayer;
currentPlayer = newPlayer;
currentPlayer->next = NULL;
printf("Please enter second element: ");
scanf("%d", ¤tPlayer->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 player
或 player_t
.
永远记住关键字 typedef
只是为了我们这些程序员的可读性。不要指望它做一些额外的工作。
编辑:如评论中所述,可以使用 typedef struct player player
并通过 struct player
或简单的 player
.