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

在VS2008中访问void*的内容时,如何克服“错误C2100:非法间接寻址”

  •  4
  • David Arno  · 技术社区  · 16 年前

    我在VS2008中创建了一个C应用程序。我正在创建一个模拟创建函数,它覆盖结构中的函数引用。但是,如果我尝试以一种直截了当的方式来做这件事,比如:

    void *ptr = &(*env)->GetVersion;
    *ptr = <address of new function>
    

    *structOffsetPointer = &(*env)->GetVersion;
    functionPointer = thisGetVersion;
    structOffsetPointerAsLong = (long *)structOffsetPointer;
    *structOffsetPointerAsLong = (long)functionPointer;
    

    但我担心,如果在32位和64位环境之间切换,使用长指针或int指针会导致问题。

    那么,有没有简单的方法来禁用此错误?假设不是,win64下是int还是long 64位?

    4 回复  |  直到 16 年前
        1
  •  4
  •   Jim Buck    16 年前

    void blah = 0xdeadbabe; // let's assume a 32-bit addressing system
    

    要添加到我自己的响应中并给出解决方案,我会给它一个指向GetVersion is类型函数的指针的正确类型。如果“env”结构字段指向的GetVersion为:

    int GetVersion();
    

    那么你想要:

    int (**ptr)() = &(*env)->GetVersion;
    
        2
  •  4
  •   Tony Lee    16 年前

    void **ptr = (void **) &(*env)->GetVersion;
    *ptr = <address of new function>
    

    正确的方法是使用类型系统,避免所有类型转换,并声明指向以下函数的实际指针:

    typedef int (*fncPtr)(void);
    fncPtr *ptr = &(*env)->GetVersion;
    *ptr = NewFunction;
    

    以上假设GetVersion是fncPtr类型,NewFunction声明为

        3
  •  1
  •   Paul Nathan    16 年前

    上次我玩void*&在VisualStudio下,VS没有很好地发挥作用。 以下是一些信息数据点:

    假设 你没有。这是因为它需要指向内存空间中的任何位置。暂时 在机器上,函数指针的大小将与数据指针的大小相同,因为数据和代码占用相同的内存空间。这是不保证的,根据 哈佛 建筑学我对WindowsVista不太熟悉,不知道它是否出于安全原因在程序上伪造了哈佛大学的体系结构。

    我个人会的 禁用此错误,只是为了让编译器完成其工作。

        4
  •  1
  •   Michael Burr    16 年前

    但是,您还谈到担心可能存储指针的int类型的大小(除非您有很好的理由,否则通常不希望这样做)。

    如果出于某种原因希望在int类型中保留指针,那么在Windows上 UINT_PTR uintptr_t 从…起 stdint.h 如果您有它)将容纳大多数指针类型(我认为它不一定大到足以容纳一些指向成员类型的指针)。