c - 指向函数指针的指针数组的声明、分配和赋值

标签 c

这是我的第一篇文章,所以请保持温柔。

过去我一直在玩弄C。现在我已经开始了一个真正的项目(一个使用 SDL 的 2D 图形引擎,但这与问题无关),可以说我有一些真正的 C 经验。昨天,在做事件系统的时候遇到了一个无法解决的问题。

有这个 typedef,


//the void parameter is really an SDL_Event*.  
//but that  is irrelevant for this question.  
typedef void (*event_callback)(void);  

它指定要在引擎事件上调用的函数的签名。

我希望能够支持多个 event_callbacks,所以这些回调的数组是一个想法,但不想限制回调的数量,所以我需要某种动态分配。这就是问题出现的地方。我的第一次尝试是这样的:


//initial size of callback vector  
static const int initial_vecsize = 32;  
//our event callback vector  
static event_callback* vec = 0;  
//size  
static unsigned int vecsize = 0;  

void register_event_callback(event_callback func) {  
    if (!vec)  
        __engine_allocate_vec(vec);  
    vec[vecsize++] = func; //error here!  
}  

static void __engine_allocate_vec(engine_callback* vec) {  
    vec = (engine_callback*) malloc(sizeof(engine_callback*) * initial_vecsize);  
}  

首先,我省略了一些错误检查以及当回调数量超过 vector 大小时重新分配回调 vector 的代码。

但是,当我运行这段代码时,程序如代码中所述崩溃了。我猜是段错误,但我不能确定,因为没有给出输出。我还猜测该错误是由于对如何声明和分配指针数组到函数指针的理解存在缺陷。

请 Stack Overflow 指导我。

编辑:我似乎无法掌握如何缩进代码块。这几乎有点尴尬......

编辑:没关系。检查了其他一些帖子的页面源=)。

最佳答案

分配函数应该是:

static void __engine_allocate_vec(engine_callback** vec) {  
    *vec =  malloc(sizeof(engine_callback) * initial_vecsize);  
}  

然后:

if (!vec)  
    __engine_allocate_vec(&vec);  

请注意,如果您省略了强制转换,则原始分配函数中的指针类型不匹配将被捕获。另外,不要在代码中使用包含双下划线的名称 - 它们是供实现使用的。

关于c - 指向函数指针的指针数组的声明、分配和赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2912136/

相关文章:

c++ - OpenCV:使用 cvWriteFrame 从网络摄像头写入视频时内存泄漏

c - SIGSEGV - 运行时错误

c - 随机打乱一组字符串

c - 为什么这两个相同的功能不同?

c - printf 显示 "-858993460"或 "╠╠╠╠╠╠╠╠";这些是什么?

c - -9 % 7 怎么可能是 -2 或 5?

c - 与 EEPROM 的 I2C 通信

c - 如何使用c找到DFS中的组件数量?

c - 尽管使用指向导航的指针,但数组的地址已更改

c - 理解 C : Incrementing pointers