【问题标题】:C++ Program crash when calling function from address从地址调用函数时C++程序崩溃
【发布时间】:2015-05-06 16:19:02
【问题描述】:
void print()
{
  printf("Test");
}

这不起作用

test.exe 中 0x00402826 处未处理的异常:0xC0000005:访问 违规读取位置0x00000000。

int main()
{
  typedef void function(void);
  function* Execute = (function*)0x00402810;
  Execute();
}

但这有效吗?

int main()
{
  void(*func)();
  func = &print;
  cout << func;
  getchar();

  typedef void function(void);
  function* Execute = (function*)0x00402810;
  Execute();
 }

我正在使用 /Dynamicbase:NO 进行编译

所以地址在每次运行时都是静态的。

【问题讨论】:

  • 你试过用typedef void(function*)();代替typedef void function(void)吗?
  • 你如何保证你的函数实际上是从 0x402810 开始的?你不能!编译器可以随意移动你的函数。
  • 是的,它适用于下面的代码。

标签: c++ function memory


【解决方案1】:

无法保证当您在 main() 之前声明 print() 时,它实际上会编译到 main() 之前的几个地址(正如人们所期望的那样)。从这里开始,由于第二个示例中的 main() 函数与第一个(更大)不同,因此 print() 函数的地址可能在两个示例之间发生了变化。

如果你真的想找出你的函数的地址,我建议使用调试器来找出它。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多