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

如何创建包含任意参数的C语言函数指针数组?

⚠️ 警告 ⚠️

后来发现我犯了个错,其实我并不需要这么做,因为我所有的函数都会有相同的签名。

总结

在C语言中,根本不存在一种安全的(即可在编译时检查的)方式来使用包含任意签名(至少是任意参数)的函数指针数组。你必须使用测试框架或自行实现测试来捕获对数组中函数的错误调用。

原问题

我需要一个指向含任意数量参数的函数的指针数组,所有函数的返回值均为void。

我明白,若要将函数存储在指针数组中,C语言要求它们必须具有统一的签名才能管理调用。

这看似矛盾,但并非如此。该数组应包含参数形式任意的函数,每个函数都有自己的签名,可能与数组中其他函数不同。

常见的解决方案是使用void**类型的参数指针数组,或直接使用void*类型的参数数组,然后进行类型转换。

#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>

void foo(void *args) {
    uint32_t a;
    uint16_t b;
    uint16_t c;
    
    memcpy(&a, args, sizeof(uint32_t));
    ssize_t position = sizeof(uint32_t);

    memcpy(&b, args+position, sizeof(uint16_t));
    position += sizeof(uint16_t);

    memcpy(&c, args+position, sizeof(uint16_t));

    printf("a: %d\nb: %d\nc: %d", a, b, c);
}

void bar(void *args) {
    /* ... */
};

int main() {
    void *args = malloc(8);
    
    uint32_t a = 12;
    uint16_t b = 40;
    uint16_t c = 8;

    memcpy(args, &a, sizeof(uint32_t));
    ssize_t position = sizeof(uint32_t);

    memcpy(args+position, &b, sizeof(uint16_t));
    position += sizeof(uint16_t);

    memcpy(args+position, &c, sizeof(uint16_t));
    position += sizeof(uint16_t);

    void (*functions[16])(void *);

    functions[0] = foo;
    functions[1] = bar;

    functions[0](args);

    return 0;
}

这种方法虽然可行,但并不安全,存在函数输入不明确的风险。

有没有更简单、更安全的方法来实现这一需求,同时避免让调用者陷入失控的局面?

内容的提问来源于stack exchange,提问作者dqvid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:37:03