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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:37:08