You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言链表代码出现不兼容指针类型警告的原因及修复方法

为什么会出现这个指针类型不兼容警告?

你碰到的这个警告,根源在于结构体定义时的类型声明混乱:

你的代码里用typedef struct { ... } player;定义了一个匿名结构体的别名player,但结构体内部的next指针写的是struct player *next——这里的struct player是一个完全没被定义过的全新结构体类型,和你typedef出来的player根本不是一回事。这就导致当你把player*类型的变量(比如newPlayer)赋值给struct player*类型的next,或者反过来赋值时,编译器会判定这是两种不兼容的指针类型,于是抛出警告。

怎么修复这个问题?

有两种简单靠谱的修复方式,选哪种都可以:

方式一:给结构体加上标签,让内部指针和typedef类型匹配

修改结构体的typedef定义,给结构体加上player标签,这样内部的struct player *next就会指向这个带标签的结构体,和typedef后的player类型完全统一:

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

方式二:先声明typedef别名,再用别名定义内部指针

这种写法需要先提前声明typedef的名称(C语言允许这种前置声明),然后在结构体里直接用别名声明指针:

typedef struct player player; // 先typedef前置声明

struct player {
    int number;
    player *next; // 直接用已声明的player别名
};
修复后的完整可运行代码

这里给出用方式一修复后的完整代码,编译时已经不会再出现类型不兼容的警告:

#include<stdio.h>
#include<stdlib.h>
typedef struct player {
    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");
}

内容的提问来源于stack exchange,提问作者J0S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:27:57