c - 列表编译,但给出警告:不兼容的指针类型
问题描述
#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;
声明了两种类型。第一个是一个未命名的结构,它被赋予了 typedef name 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 中声明。
推荐阅读
- java - 在函数 onBindViewHolder 中使用 RecyclerView.ViewHolder 进行投射错误
- javascript - 运行 Jest 进行测试时,如何解决以下编译错误?
- c# - C# Entity Framework linq 查询将捕获什么
- amazon-web-services - 在 CloudFront 的账户之间共享 S3 存储桶
- prestashop-1.7 - PrestaShop:如何修复在所有产品中自动打开的社交分享切换
- javascript - JavaScript:创建一个接受数组和回调并返回对象的函数 groupBy
- javascript - 如何修复我不断重定向到操作页面的 jquery ajax 登录表单?
- jenkins - 如何在 jenkins 构建管道脚本中传递 AWS 密钥和 id?
- javascript - 创建一个列表,其中有用户单击并悬停一个元素的按钮,以打开另一个
- .net-core - .net 核心 web api jwt