函数指针在C奇怪的行为

liv*_*hak -1 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;

}
Run Code Online (Sandbox Code Playgroud)

函数指针decleration

void (*callback)(void*);
Run Code Online (Sandbox Code Playgroud)

声明一个callback带有泛型指针并返回void 的函数指针.

在分配cbfunccallback

callback = cbfunc;
Run Code Online (Sandbox Code Playgroud)

我收到了警告

warning: assignment from incompatible pointer type [enabled by default]
Run Code Online (Sandbox Code Playgroud)

如果我使用以下内容

callback = (void*)cbfunc;
Run Code Online (Sandbox Code Playgroud)

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

有人能解释一下这个原因吗?

Ant*_*onH 8

更改void (*callback)(void *);void (*callback)(myst *);,因为这是你的函数实际上是.


Eri*_*ert 5

为什么分配会产生警告?

你有超强的力量:你可以和任何狗交朋友.你被放进一个盒子里面写着"这个盒子里的人可以和任何动物交朋友".然后有人把老虎放在你的盒子里.你今天过得怎么样?

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

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

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