有人可以解释一下这意味着什么吗? void(* func)();

时间:2011-12-02 05:35:15

标签: c callback function-pointers void-pointers

我有一个结构,其中有一个元素表示为void (*func)();我知道void指针通常用于函数指针,但我似乎无法定义函数。我一直在dereferencing pointer to incomplete type。我用Google搜索但无济于事。任何建议将不胜感激。

我正在尝试这样做:

struct callback * cb;
cb->func = *readUserInput;

ReadUserInput定义为:

void readUserInput(void)
{
}

回调定义如下:

struct callback {
    void (*func)();
    int pcount;
    enum attr_type type;
    void *p[0];
 };

2 个答案:

答案 0 :(得分:2)

您需要获取该函数的地址,而不是尝试取消引用它。

更改

cb->func = *readUserInput;

cb->func = &readUserInput;

此外,您正在创建一个具有垃圾值的指针,然后将其解除引用,从而导致未定义的行为。您需要以某种方式为其分配空间(malloc/free或者只是在堆栈上分配空间):

struct callback cb; // put it on the stack
cb.func = &readUserInput;

struct callback * cb = malloc(sizeof(callback));
cb->func = &readUserInput;

...

free(cb);

答案 1 :(得分:2)

你有三个问题。

分配函数指针时的语法不正确,并且实际上并没有定义struct回调的实例。

你想说:

struct callback cb;
cb.func = readUserInput;

您可以显式获取readUserInput函数的地址,但这是不必要的。该语法如下所示:

struct callback cb;
cb.func = &readUserInput;

在标准C中,裸函数名称将被评估为函数的地址。

最后,你的回调有错误的签名。它被定义为一个函数,它接受未知数量的参数并且不返回任何内容。

结构中的声明调用指向函数的指针,该函数不带参数并且不返回任何内容。

将回调函数定义为:

void readUserInput()
{

}

或将结构中的声明更正为:

struct callback {
    void (*func)(void);
    int pcount;
    enum attr_type type;
    void *p[0];
 };