结构体声明引发不兼容指针类型警告,如何解决该问题?
解决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
相关产品推荐
相关产品推荐

