[英]Malloc an array of function pointers
我有一组函数需要在运行时分配才能按顺序调用。 哪个函数指针以编程方式确定哪个点,例如:
void ((drawFunctions*)(...))[0] = drawTriangle;
...
for(...)
drawFunctions[i](...);
我想要malloc一个函数指针数组,因为直到运行时我才知道需要多少个。 你会怎么做?
typedef可能会使语法更具可忍性:
typedef void (*drawFunctionPointer)(void);
drawFunctionPointer *drawFunctions = malloc(sizeof(drawFunctionPointer) * numFunctions);
首先,在C99中, 可变函数应该至少有一个第一个非变量参数(比如printf
有一个const char*fmt
第一个参数)。 见stdarg(3)
然后,为了便于阅读,我将使用typedef
来声明函数签名,例如
typedef void drawfun_sigt (int, ...);
声明一个包含指向指针数组的指针的变量:
drawfun_sigt** parr = NULL;
分配它(并处理失败):
size_t nbfun = somenumber();
parr = malloc(nbfun*sizeof(drawfun_sigt*));
if (!parr) { perror("malloc"); exit(EXIT_FAILURE); };
清除它(为了使行为更具可重复性,我不喜欢malloc
-ed数组中未初始化的元素;但是cmaster评论说valgrind会发现这些错误); 你可以使用calloc
而不是malloc
:
memset (parr, 0, nbfun*sizeof(drawfun_sigt*));
然后适当填写
extern void drawfunfoo(int, ....);
parr[0] = drawfunfoo;
当然,有很多方法可以获得函数地址。 在POSIX系统(特别是Linux)上,您甚至可以使用dlopen(3)和dlsym(3)通过其名称动态获取此类地址
如果您的函数指针具有完全未知的签名(即,如果省略号...
在您的问题中意味着除了可变参数函数之外的东西),您应该使用libffi (或者,如果已知签名集,则使用函数指针的union
) 。 请注意,C实现上的调用约定 (和ABI )可能(并且经常)指示调用具有不同签名的函数的不同方法。 例如, x86-64 ABI for Linux要求可变函数和非可变函数以不同方式调用,并在寄存器中传递一些形式参数(整数和浮点的不同寄存器)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.