C语言赋值时出现不兼容指针类型警告的问题求解
解决「assignment from incompatible pointer type」指针类型不兼容警告
这个警告的根源是结构体类型声明不匹配,咱们来一步步拆解问题:
问题原因分析
先看你的结构体定义细节:
- 你定义ADRESSIP时,用的是:
typedef struct adressIP{ // struct的标签是小写结尾的adressIP int n1; int n2; int n3; int n4; }ADRESSIP; // typedef后的类型名是大写的ADRESSIP
- 但在MACHINE结构体里,你把ip成员声明为:
struct ADRESSIP *ip; // 这里用的是struct ADRESSIP,和上面的struct adressIP不是同一个类型!
编译器会把struct ADRESSIP当成一个未定义的全新结构体类型,而你malloc出来的ip是ADRESSIP*(typedef后的类型),这两个指针指向的是完全不同的结构体,自然会触发类型不兼容的警告。
两种解决方案
方案一:直接使用typedef后的类型(最简单)
修改MACHINE结构体的ip成员声明,把struct ADRESSIP *ip;改成ADRESSIP *ip;,这样类型就完全匹配了:
typedef struct machine{ struct machine *suivant; const char* nom; ADRESSIP *ip; // 这里改成typedef后的类型 }MACHINE;
方案二:统一结构体标签与typedef名称(更规范)
调整ADRESSIP的定义,让struct标签和typedef名称一致,这样struct ADRESSIP和ADRESSIP就指向同一个类型了:
typedef struct ADRESSIP{ // struct标签改为ADRESSIP,和typedef名一致 int n1; int n2; int n3; int n4; }ADRESSIP;
这种写法在处理结构体互相引用时更清晰,也能避免类似的类型混淆问题。
额外提醒
你的create_machine函数最后没有return m;语句,这会导致函数返回值未定义,记得补上:
MACHINE* create_machine(RESEAU *r){ // ... 现有代码 ... m->suivant = NULL; m->ip=ip; return m; // 必须添加这个返回语句 }
内容的提问来源于stack exchange,提问作者Vengeance Queen
相关产品推荐
相关产品推荐

