【问题标题】:Linking against hard-coded function pointer链接硬编码函数指针
【发布时间】:2010-12-03 08:54:50
【问题描述】:

我知道具有已知签名的特定函数位于已知地址。如何在 C++ 中初始化函数指针?

我尝试了以下(及其许多变体)但无济于事:

int (*FunctionName)(int arg1, long arg2, char *arg3) = (int (*FunctionName)(int arg1, long arg2, char *arg3))0xCAKE;

我感觉是右边的表达式造成了麻烦,因为如果代码初始化为0x0/NULL,代码就会编译。任何指针? (双关语)。

【问题讨论】:

  • 你试过从空指针开始,然后加上0xCAKE/sizeof(functionpointer)吗?
  • 呃,没关系,按 CashCow 说的做
  • 你不应该太确定函数指针实际上只是一个地址。它们可以是结构,也可以是指向结构的指针,编译器实际上会在其中发出一个小子例程来加载跳转目标并转到那里。指向类成员的指针就是一个例子:codeproject.com/KB/cpp/FastDelegate.aspx。 PowerPC 函数描述符是另一个。
  • 在我所有的挫败感以及类型的混合和匹配中,我粘贴了显然是非功能性的代码。我接受了@CashCow 的回答,因为它确实为我阐明了这个概念(以及代码)并且适合我的小头脑。 @Crashworks:这很有趣。或许从现在开始,我不应该这么急于做出假设!

标签: c++ pointers initialization


【解决方案1】:

除了 CAKE 不是一个正确的十六进制值,因为 K 不是一个有效的十六进制字符,加上任何关于不同指针类型的问题,你的主要错误是 FunctionName 是一个变量而不是一个类型。

就像在做

px = (px)0xBADFACE;

其中 px 是一个常规指针

如果您删除右侧的 FunctionName 留下其余部分,它可能会起作用,但更简单的是 typedef。

typedef int( *FuncType)(int arg1, long arg2, char * arg3 );
FuncType FunctionName = (FuncType)(0xCAFE);

【讨论】:

    【解决方案2】:
    int (*FunctionName)(int arg1, long arg2, char *arg3) = (int ( * )(int arg1, long arg2, char *arg3))0x01;
    

    适用于 VS2008。 FunctionName 是变量的名称,而不是类型的一部分。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 2023-03-24
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多