void *函数指针数组转换

时间:2017-09-24 05:47:27

标签: c arrays function pointers function-pointers

我有一个看起来像这样的数组:

void* functions[]; // pointer to functions, each function returns an int and has int parameters A and B

我想将其投入以下内容:

int (*F)(int a, int b) = ((CAST HERE) functions)[0];
int result = F(a, b);

我已经尝试过“(int(*)(int,int))”作为强制转换,但编译器抱怨我试图将函数指针用作数组。

3 个答案:

答案 0 :(得分:4)

对函数类型使用typedef会有所帮助:

typedef int F_type(int, int);

然后你可以写:

F_type *F = (F_type *)(functions[0]);

在使用索引运算符之前尝试将functions转换为其他内容将是未定义的行为(严格别名违规)。

请注意,标准C不支持将void *转换为函数指针。如果可能,首先使数组成为函数指针:

F_type *functions[] = { &func1, &func2 };

NB。有些人更喜欢使用typedef作为函数指针类型,而不是函数类型。我认为这样可以避免使用更具可读性的代码来避免指针typedef,但是我提到了这一点,这样你就可以理解其他的建议。

答案 1 :(得分:2)

使用(int (**)(int, int))进行投射现在似乎可以解决问题,但它会调用未定义的行为

void*转换为函数指针不是标准C。

请注意将void*别名为其他类型;严格的别名违规。阅读What is the effect of casting a function pointer void?

中的更多内容

请考虑从一开始就使用一系列函数指针。

答案 2 :(得分:0)

function是指向void类型数据的指针数组。您希望将其转换为指向int (*)(int, int)类型指针的指针,该指针将为int (**)(int, int),因此以下工作原理:

int (*F)(int, int) = ((int (**)(int, int)) functions)[0];

正如@M.M所指出的,上述情况会导致未定义的行为。您可能需要阅读this帖子和this了解更多信息。

理想情况下,你会做这样的事情:

// Array of 2 pointers to functions that return int and takes 2 ints
int (*functions[2])(int, int) = {&foo, &bar};

// a pointer to function
int (*F)(int, int) = functions[0];
int r = F(3, 4);