首页 > 解决方案 > 列表编译,但给出警告:不兼容的指针类型

问题描述

#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;
为什么会这样以及如何修复它?
先感谢您 :)

标签: cstructdeclarationtypedefincompatibletypeerror

解决方案


在这个 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 中声明。


推荐阅读