函数ptrs数组上的realloc()导致SIGABRT

时间:2013-01-26 16:53:08

标签: c arrays pointers function-pointers realloc

在我当前的项目中,我在运行程序的主要部分之前进行了一些函数ptr收集。

一些代码:

typedef void(*ShutdownFunctionPtr)(void);
static ShutdownFunctionPtr  *shutdown_functions;
static unsigned int         shutdown_functions_cnt;

/* some stuff */
shutdown_functions      = (ShutdownFunctionPtr*) malloc(sizeof(ShutdownFunctionPtr));
shutdown_functions_cnt  = 0;

/* a function to put a functionptr into the array */
void put(void (*func)(void)) { 
    shutdown_functions = (ShutdownFunctionPtr*))realloc(shutdown_functions, sizeof(ShutdownFunctionPtr) * shutdown_functions_cnt+1);
/* put the function and increment shutdown_functions_cnt  */
}

最后一行崩溃了一切。我目前使用MALLOC_CHECK_ = 1或更高版本运行程序以获得良好的回溯。但我无法弄清楚问题出在哪里。我调试了shutdown_functions是一个无效的指针,但仅在put()函数的第二次调用时。第一个电话工作正常!

问候!

编辑:当然,我在put()

的来电之间没有触及任何内容

编辑:

如您所想

typedef void(*ShutdownFunctionPtr)(void);
static ShutdownFunctionPtr *funcs;

static void foo(void);
static void bar(void);
static void register(void (*func)(void));

static void register(void (*func)(void)) {
    funcs = realloc(funcs, sizeof(ShutdownFunctionPtr) * (cnt+1));
    funcs[cnt] = func;
    cnt++;
}

int main(void) {
    funcs = malloc(sizeof(ShutdownFunctionPtr));
    register(foo);
    register(bar);
}

/* foo and bar somewere */

这就是真正的代码。

1 个答案:

答案 0 :(得分:4)

至少存在以下问题:

sizeof(ShutdownFunctionPtr) * shutdown_functions_cnt+1

你可能意味着

sizeof(ShutdownFunctionPtr) * (shutdown_functions_cnt+1)