C语言函数指针结构体初始化时出现不兼容指针类型警告问题
解决“从不兼容指针类型初始化”的警告问题
嘿,作为C新手遇到这种指针类型问题太正常了,我帮你把问题捋明白,再给你搞定的方案:
问题到底出在哪?
先看你这段类型定义:
typedef int (*pointer_func)(Game *); typedef struct { char *funcName; pointer_func *f; }userFunc;
你已经把pointer_func定义成了函数指针类型(专门指向int (*)(Game*)这种签名的函数),但在userFunc结构体里,你把f声明成了pointer_func *——这可是指向函数指针的指针,相当于int (**)(Game*)这种复杂类型。
而你初始化数组的时候,给的save、load这些函数名,本质就是普通的函数指针(类型是int (*)(Game*)),和pointer_func *完全不匹配,编译器自然就抛出“从不兼容指针类型初始化”的警告了。
快速修复方案
只需要把userFunc结构体里的f类型改一下,去掉后面的星号就行:
typedef struct { char *funcName; pointer_func f; }userFunc;
这样初始化Name_arr的时候,{"save", save}里的save就和f的类型完全匹配了,警告直接消失。
额外提个小坑(避免后续崩溃)
你的save函数里有个隐藏的大问题:str和writeString都是未初始化的野指针,直接用sprintf往里面写数据会触发未定义行为(比如程序突然崩溃)。建议改成栈上的数组,比如:
char str[256]; // 足够容纳最长20字符的文件名+.txt char writeString[256]; // 足够存储要写入文件的状态数据
这样不用手动分配内存,还能彻底避免野指针的隐患。
修正后的核心代码片段
typedef struct { char Player1[2], Player[2], **gameGrid; int height,width; int moveNum, player1Num, player2Num; bool player1Win, player2Win; }Game; typedef int (*pointer_func)(Game *); // 这里修改了f的类型,去掉了星号 typedef struct { char *funcName; pointer_func f; }userFunc; int save(Game *struc); int load(Game *struc); int move(Game *struc); int quit(Game *struc); void free_grid(Game *struc); int main(){ userFunc Name_arr[] = { {"save",save}, {"load",load}, {"quit",quit}, {"move",move} }; // ... 你的其他逻辑代码 }
内容的提问来源于stack exchange,提问作者Mr_incompetent
相关产品推荐
相关产品推荐

