繁体   English   中英

Malloc是一组函数指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM