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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:36:02