如何重新分配函数指针数组?

时间:2012-02-01 17:03:05

标签: c arrays malloc function-pointers realloc

直接代码:

#define PRO_SIGNAL( func, param ) (*func)(param)
void PRO_SIGNAL( paint[0], Pro_Window* );

signal->paint = realloc( signal->paint, sizeof( void (*)(Pro_Window*) ) * signal->paint_count );

错误:

error: incompatible types when assigning to type 'void (*[])(struct Pro_Window *)' from type 'void *'|

3 个答案:

答案 0 :(得分:3)

您似乎正在分配数组而不是指针。

从输出错误消息:

'void (*[])(struct Pro_Window *)' from type 'void *'| 

注意那里的[](当然不是lambda!)而不是*

如果这是一个“可扩展”的结构,你需要重新分配整个结构而不仅仅是数组成员。

顺便说一句,提示:如果realloc失败,它返回一个NULL指针,如果你将它分配给正在重新分配的变量,它指向的原始内存将永远丢失。所以总是首先重新分配到temp,检查值,然后分配回原始指针(如果有效)。

答案 1 :(得分:1)

您没有向我们展示singal->paint的定义,但我从错误消息中推断出它被声明为函数指针数组,这意味着signal是一个struct flex数组(paint[])。您无法分配给数组,您需要重新分配整个struct

答案 2 :(得分:0)

不确定你要做什么,但这在这里运作得很好:

#include <stdlib.h>

int main(int argc, char ** argv)
{
        void (**foobar) (int a, int b);
        void (**tmp) (int a, int b);
        foobar = NULL;
        if (!(foobar = malloc(sizeof(*foobar)*4))
            return 1;
        if (!(tmp = realloc(foobar, sizeof(*foobar)*5)) {
            free(foobar);
            return 1;
        } else {
            foobar = tmp;
        }
        free(foobar);
        return 0;
}

所以,你要么像凯文所说的那样尝试realloc一个数组,要么就是你在C ++模式下进行编译,我相信这些模型不是隐含的。

编辑:我添加了一些错误处理。