【发布时间】:2021-03-23 08:31:06
【问题描述】:
为什么我需要删除函数指针转换才能使用如下所示的函数?
编译:
#include <stdio.h>
int print_int(int i){
printf("%d", i);
return i;
}
typedef int (*print_int_func) (int);
int main(){
void** p = malloc(1*sizeof(print_int_func*));
p[0] = (print_int_func*)print_int;
((print_int_func)p[0])(2); // This Compiles
((print_int_func*)p[0])(2); // This does NOT
return 0;
}
【问题讨论】:
-
如果你分配给
void**,你需要使用malloc(1 * sizeof(void*))。sizeof的参数始终是目标类型,*少一个。 -
@Barmar 我正在尝试将函数存储在 void 指针数组中。目前它有效。但是我试图理解为什么指针声明是这样的。
-
参见stackoverflow.com/questions/3941793/… 不能保证
void*可以保存函数指针。 -
一般来说你不会取消引用函数指针。
-
@Barmar:他们不应该首先使用
void *;函数指针不同于对象指针,void *不是函数指针的泛型。此外,对于sizeof,最好使用分配的实际标识符和*,而不是重复类型:AnyType *p = malloc(NumberOf * sizeof *p);。
标签: c pointers casting function-pointers void-pointers