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

结构体声明引发不兼容指针类型警告,如何解决该问题?

解决C语言不兼容指针类型警告问题

问题描述

编译时出现如下警告:

list.h: In function ‘CreateNewLinks’:
list.h:29:20: warning: assignment to ‘numbers *’ from incompatible pointer type ‘struct numbers *’ [-Wincompatible-pointer-types]
   29 |             linked = linked->NextNum;

对应的代码片段:

typedef struct{
    int num;
    struct numbers *NextNum;
}numbers;


numbers *CreateNewLinks(){

    numbers *head=NULL;
    
    head=malloc(sizeof(numbers));
    numbers* linked = head;
    
    char answer;
    
    do{
    
        printf("Enter number : ");
        scanf("%d",&linked->num);
        
        printf("Do you want to add (y/n) : ");
        scanf("%c",&answer);
        
        if(answer == 'y' || answer == 'Y'){
            linked->NextNum = malloc(sizeof(numbers));
            linked = linked->NextNum;
        }else
           linked->NextNum = NULL;
    
    }while(answer =='y' || answer == 'Y');
    
    return head;
}

解决方案

问题根源在于结构体typedef的定义方式错误:
你当前是给一个匿名结构体起别名numbers,但结构体内部的NextNum声明的是struct numbers*——这个struct numbers并没有被实际定义过,编译器会将它视为一个独立的、未完成的结构体类型,和你typedef出来的numbers不是同一个类型,因此赋值时会触发指针类型不兼容警告。

修正方法是先给结构体命名,再进行typedef:

// 先声明struct numbers,再typedef为numbers
typedef struct numbers {
    int num;
    struct numbers *NextNum;
} numbers;

这样struct numbers和typedef后的numbers就关联成同一个类型,指针赋值时类型完全匹配,警告会消失。

额外提示

你的代码还有一个小问题:scanf("%c", &answer);会读取上一次scanf("%d")留下的换行符,导致answer直接被赋值为换行,循环逻辑可能不符合预期。可以修改为:

scanf(" %c", &answer); // 前面加空格,跳过空白字符

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 13:28:21