我想创建一个void函数指针数组,分配它的内存并分配给我希望它包含的函数的数组地址。 在声明数组时,您可以使用括号中的列表形式为其分配元素,如下所示:
const char *array[NUM_OF_ELEMENTS] = {"foo1", "boo2", "foo2", "boo2"}; // etc.
好的。我已经声明了一个指向void函数的指针数组,如下所示:
void (*pointerArray)(void) = malloc(NUM_OF_ELEMENTS * sizeof(*pointerArray));
我的问题是:是否可以先声明一个函数并同时分配其内存,然后使用"括号形式"在我的pointerArray上分配地址,所以它实际上指向任何函数?更一般的问题:有没有办法快速完成它,或者我必须这么做,如下所示:
pointerArray[0] = func1;
pointerArray[1] = func2;
pointerArray[2] = func3; // etc.
答案 0 :(得分:2)
NUM_OF_ELEMENTS
是一个常量值,似乎没有任何理由让你动态分配这个数组,所以你也可以静态分配它并在声明时初始化它:
typedef void(*func_ptr)(void);
func_ptr func_ptr_array[] = {func1,func2,func3};
答案 1 :(得分:1)
您可以使用堆栈:
void (*p_stack[])(void) = { func1 , func2 } ;
或者在你真的需要使用malloc的情况下,首先使用malloc分配你的数组,然后在堆栈上分配另一个并复制:
void (*p_stack[NUM_OF_ELEMENTS])(void) = { func1 , func2 } ;
void (**pointerArray)(void) = malloc(NUM_OF_ELEMENTS * sizeof(*pointerArray));
memcpy( pointerArray , p_stack , sizeof( p_stack) ) ;
初始化在p_stack数组上完成,然后复制到分配的数组。
答案 2 :(得分:-1)
void (*pointerArray)(void)
是函数指针的声明。 *pointerArray
是功能。函数没有大小,你不能分配它们,也没有函数数组,你不能分配或复制函数。
您需要的是一系列函数指针。为了简化操作,请使用typedef标记它:
typedef void vfun(void);
typedef vfun* vfunp;
vfunp* pointerArray = malloc (NUM_OF_ELEMENTS * sizeof(vfunp));
pointerArray[0] = func1;
pointerArray[1] = func2;
pointerArray[2] = func3; // etc.
如果您愿意,也可以使用静态分配的数组:
vfunp pointerArray[] = { func1, func2, func3 };