函数指针在C奇怪的行为

时间:2014-02-10 21:17:29

标签: c pointers function-pointers

我有一个使用函数指针的小程序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _myst
{
    int a;
    char b[10];
}myst;

void cbfunc(myst *mt)
{
    fprintf(stdout,"called %d %s. \n",mt->a,mt->b);
}

int main()
{

    /* func pointer */
    void (*callback)(void *);

    myst m;
    m.a=10;
    strcpy(m.b,"123");

    /* point to callback function */
    callback = (void*)cbfunc;

    /* perform callback and pass in the param */
    callback(&m);

    return 0;

}

函数指针解除

void (*callback)(void*);

声明一个函数指针callback,它接受​​泛型指针并返回void。

cbfunc分配给callback

callback = cbfunc;

我收到了警告

warning: assignment from incompatible pointer type [enabled by default]

如果我使用以下

callback = (void*)cbfunc;

它编译时没有任何警告。我正在使用gcc(4.6.3)并使用CFLAGS编译= -g -O3 -Wall

有人可以解释原因吗?

2 个答案:

答案 0 :(得分:8)

void (*callback)(void *);更改为void (*callback)(myst *);,因为这正是您的功能实际所在。

答案 1 :(得分:5)

  

为什么分配会产生警告?

你有超强的力量:你可以和任何狗交朋友。你被放进一个盒子里面说'#34;这个盒子里的人可以和任何动物结交朋友&#34;。然后有人把老虎放在你的盒子里。你今天过得怎么样?

现在你明白为什么这项任务是一个警告?你有一个方法,声明它可以接受任何指向myst的指针,你把它放在一个框中,表示&#34;这个指针指向的函数可以接受指向任何东西的指针&#34;。这有潜在危险;是什么阻止该函数指针的用户将指针传递给老虎进入函数?

  

为什么编译器在出现转换时会禁止警告?

因为这是演员的目的。一个演员操作员意味着&#34;编译器,我知道我正在做的事情是疯狂的危险,但我的意思是这样做,并知道它会起作用,所以停止向我发出有关这种疯狂转换的警告和错误&#34;。演员有效地关闭了安全系统。 如果这不是您的意思,那么就不要写演员