2012-02-01 53 views
1

直奔代码:如何重新分配一个函数指针数组?

#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

看起来你正在给数组赋值而不是指针。

从您的输出错误信息:

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

注意[]在那里(和它肯定不是一个lambda!),而不是*

如果这是一个“可扩展”结构你需要重新分配整个结构体而不仅仅是数组成员。顺便提一句,如果realloc失败,它将返回一个NULL指针,如果将它指定给被重新分配的变量,它指向的原始内存将永远丢失。所以总是首先将它重新分配到一个temp中,然后检查这个值,然后在原始指针返回时返回它。

1

你不告诉我们的singal->paint的定义,但我从它被声明为功能的阵列错误信息推断指针,意思是signal是带有柔性阵列的structpaint[])。你不能分配给一个数组,你需要重新分配整个struct

+0

对不起,我忘了提及这个,但声明paint [0]实际上是在signal的结构中。 – ApprenticeHacker 2012-02-01 17:23:30

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++编译模式,在那里我相信演员并不隐含。

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

+0

看看CashCow的提示。使用foobar作为realloc的参数并将其设置为realloc的返回值是一个糟糕的主意。 – 2012-02-01 22:15:49