代码之家  ›  专栏  ›  技术社区  ›  uray

将指针投射到函子,并调用它

  •  0
  • uray  · 技术社区  · 16 年前

    我可以这样做吗:

    typedef void (*functor)(void* param);
    
    //machine code of function
    char functionBody[] = {
        0xff,0x43,0xBC,0xC0,0xDE,....
    }
    //cast pointer to function
    functor myFunc = (functor)functionBody;
    //call to functor
    myFunc(param);
    
    4 回复  |  直到 16 年前
        1
  •  1
  •   caf    16 年前

    形式上,C语言不允许函数指针和对象指针之间的转换,所以这是不可能的。

    然而,许多C实现(甚至可能是“大多数”)都支持将其作为扩展。它的工作与否取决于内存权限和缓存一致性等因素,这将根据您的体系结构和操作系统而变化。

        2
  •  0
  •   Pavel Radzivilovsky    16 年前

    在大多数流行的桌面平台上,您将无法在中执行代码 data segment 因为页面权限。

        3
  •  0
  •   R.. GitHub STOP HELPING ICE    16 年前

    可以 可以使用 mmap . 请记住,即使在给定的cpu体系结构上,调用约定也可能有所不同。例如,如果调用者希望被调用者清除堆栈中的参数,那么代码最好这样做,否则返回时会崩溃(通常情况下,C ABIs不会提出这个愚蠢的要求,但这是需要考虑的。)

    与其尝试直接以C函数指针的形式调用机器代码,不如编写一个调用它的内联asm包装器。这样,您就可以控制呼叫约定。

        4
  •  0
  •   Peter G.    16 年前