C语言如何实现可存储字符串、函数指针的多类型元素数组结构
结论
你现有的数组指针无法实现该需求。
你现有的char *(*tags)[2]是指向「长度为2的char*数组」的指针,所有元素的类型被严格限定为char*,而自定义函数指针和char*是完全不同的类型,C语言的强类型规则不允许直接存储函数指针到该结构中,强制转型也会触发未定义行为,存在安全隐患。
推荐实现方案
1. 自定义结构体实现(类型安全,优先选择)
这是最符合C语言开发规范的方案,显式定义三元组的每个字段类型,编译期自动做类型校验,可读性和可维护性最高:
// 先定义你的函数指针原型,根据实际的函数参数、返回值调整 typedef void (*tag_handler)(void); // 定义三元组结构体 typedef struct { const char* open_tag; const char* close_tag; tag_handler handler; } TagTriple; // 分配20个三元组的内存,和你原有分配逻辑一致 TagTriple* tags = malloc(20 * sizeof(TagTriple));
赋值的写法完全匹配你给出的示例结构:
tags[0] = (TagTriple){"<html", "</html>", my_function}; tags[1] = (TagTriple){"<head", "</head>", my_func_2};
2. 多级指针实现(仅适合特殊场景,不推荐)
如果你坚持不用结构体,要通过指针数组/多级指针实现,可以用指向void*[3]的数组指针,利用void*兼容存储不同类型的指针(注意:函数指针转void*属于C标准的实现定义行为,主流x86、ARM平台都支持):
// 声明指向长度为3的void*数组的指针 void* (*tags)[3] = malloc(20 * sizeof *tags); // 赋值时函数指针需要强转为void* tags[0][0] = "<html"; tags[0][1] = "</html>"; tags[0][2] = (void*)my_function; tags[1][0] = "<head"; tags[1][1] = "</head>"; tags[1][2] = (void*)my_func_2; // 使用时需要手动转回正确的函数指针类型 tag_handler handler = (tag_handler)tags[0][2]; handler();
该方案没有类型校验,容易出现字段顺序错误、类型转换错误等问题,排查成本很高,非必要不建议使用。
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

