【问题标题】:How to call function through its address in C如何通过C中的地址调用函数
【发布时间】:2017-11-12 19:27:55
【问题描述】:

我需要调用函数(calloc),但我必须通过存储在DWORD中的该函数的内存地址来调用它。该函数有两个 int 参数。我认为,Calloc 应该返回指针。我试过这样的东西

//global var
DWORD addressOfFunction; 
typedef void(*originalAddress)(int, int);

int main(){
originalAddress tmp = (void *)addressOfFunction;
    tmp(x, y);
}

谁能解释一下,我在哪里犯了错误?我的解决方案不正确。

【问题讨论】:

  • 什么是操作系统? calloc - static/shared(so/dll) 等在哪里?
  • callocOriginFirstThunkAddress 是什么?它是否返回函数指针?
  • 它是 windows 10。我更改了代码。 callocOriginFirstThunkAddress 应该是 addressOfFunction
  • ???如果这是一个家庭作业,请包括你的练习,因为你问的没有意义。
  • 函数指针不保证适合DWORD。为什么你认为你“必须”这样做?这听起来像XY problem

标签: c pointers


【解决方案1】:

您的typedef 错误。会更好

typedef void* (*originalAddress)(int, int);

你的演员表也错了。 void* 是数据指针,而不是函数指针。使用转换为void* (*)(int, int),甚至更好地转换为originalAddress

【讨论】:

  • @EladHazan,不,从指针到数据类型的隐式转换(我想DWORD 是)不起作用。您必须将 (=cast) 显式转换为函数指针。
  • 好像不会调用calloc。如果我试图将某些内容保存到分配的数组中,它将崩溃。我也尝试过这样的事情。而且也有同样的问题。 typedef void fadr(int, int); unsigned long callocAddress;fadr *f = (fadr*)callocAddress; f(x, y);
  • @joe,这个typedef 也是错误的。 calloc 的返回类型是 void* 而不是 void。看到它的参数是size_t 而不是int
  • 我将其更改为 void* 和 size_t。它仍然没有被调用
猜你喜欢
  • 2019-03-25
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
相关资源
最近更新 更多