如何将内存分配给void函数指针数组并为数组分配地址

时间:2014-12-06 17:15:31

标签: c arrays pointers memory

我想创建一个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.

3 个答案:

答案 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 };