代码之家  ›  专栏  ›  技术社区  ›  David X

调用强制转换函数指针是否安全?

  •  6
  • David X  · 技术社区  · 15 年前

    尤其是,以下各项是否会不按预期工作?

    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;
        }
    

    我能依赖数据指针吗?( void* , int* , struct baz* ,但不是必要的 void(*)(void) )总是被兼容地通过?

    2 回复  |  直到 15 年前
        1
  •  7
  •   Johannes Schaub - litb    15 年前

    标准不要求这样做。标准要求 char* void* 具有相同的表示和对齐要求,所有结构指针都这样做,所有联合指针也这样做。尽管在任何情况下调用强制转换函数指针都是未定义的行为(_§6.5.2.2p9),但相同的表示和对齐要求提供了调用工作的实际保证(_§6.2.5p27)。

    其他指针类型不需要以这种方式工作,尽管我个人没有遇到过这样的机器。理论上有可能 int* 有一个更小的 sizeof 比A 烧焦* 例如(如果 int 具有比以下更严格的对齐要求 char ,这可能是合理的做法)。根据正确的调用约定,在这样一台机器上,调用一个转换函数指针几乎是不可能的。

        2
  •  1
  •   R.. GitHub STOP HELPING ICE    15 年前

    除非您的代码针对奇怪的古代大型机,否则对于所有实际用途,它都可以正常工作。没有现代机器对不同的指针类型使用不同的表示,我认为任何未来的机器都不现实。它只是不合逻辑和倒转,很像一个补码算术。

    如果你仍然担心或想满足语言纯粹主义者,遵循CAF的建议。

    推荐文章