调用casted函数指针是否安全?

Dav*_*d X 6 c casting function-pointers

特别是,以下内容将无法按预期工作:

typedef void(*func_p)(void*);

void foo(int* data)
    {
    printf("%i\n",*data);
    }

int main(int argc, char** argv)
    {
    func_p bar;
    int x = 42;

    bar = foo;
    bar((void*)&x);

    return 0;
    }
Run Code Online (Sandbox Code Playgroud)

也就是说,我可以依靠的数据指针(void*,int*,struct baz*,但不neccesarily void(*)(void))总是被compatably通过呢?

Joh*_*itb 7

标准不要求它有效.该标准要求char*,并void*具有相同的表示和对齐要求,所有结构指针这样做,所有的工会指针也这样做.虽然在任何情况下调用转换函数指针都是未定义的行为(§6.5.2.2p9),但相同的表示和对齐要求可以保证调用有效(§6.2.5p27).

其他指针类型不需要以这种方式表现,尽管我没有亲自遇到过这样的机器.从理论上讲,int*a 可能小于sizeofa char*(例如,如果int比对象要求更严格char,那么这可能是合理的事情).在正确的调用约定下,在这样的机器上,实际上不可能调用一个转换函数指针.

  • `void foo(void*p){int*data = p; ......}`好吧. (5认同)