C++ 指针分配的函数地址显示的值与函数地址不同

C++ 指针分配的函数地址显示的值与函数地址不同,c++,C++,比如说,我有一个函数 void myfunc() 如果我声明一个指针并将其赋值,函数的地址如下 void *test_pointer = (void*) &myfunc; 如果使用VisualStudio进入调试模式,我将从“监视”窗口获得以下内容 Name Value &myfunc 0x000000013fc06570 test_pointer 0x0000000

比如说,我有一个函数

void myfunc()
如果我声明一个指针并将其赋值,函数的地址如下

void *test_pointer = (void*) &myfunc;
如果使用VisualStudio进入调试模式,我将从“监视”窗口获得以下内容

Name                       Value
&myfunc                    0x000000013fc06570
test_pointer               0x000000013fa4786f

现在我期望这两个值是相同的,为什么不是这样的?

< P>严格地说,C++标准不需要实现函数指针到不透明对象指针的转换(<代码> Value*/Cuff>)。您可能被告知
void*
可以指向任何东西,但“任何东西”都不一定是函数

由于此功能仅受到有条件的支持,因此无法预知这种转换将如何进行。您的实现可能只会在保留值的同时在
void*
之间进行转换(这是标准放置的最低要求)。但两种指针表示形式中的值不必相同

<引用最新的C++标准草案,即:

将函数指针转换为对象指针类型或将函数指针转换为对象指针类型 是有条件支持的。这种转换的意义是 定义了实现,除非实现支持 双向转换,将一种类型的PR值转换为 另一种类型和背面,可能具有不同的cv资格, 应产生原始指针值


尝试使用:
void(*测试指针)(=&myfunc >代码> Value*/Cuff>应该非常少见,通常是在与C接口交互时,因为几乎总是有更好的选择。这里没有足够的上下文来提供比@BoHalimIf提供的更好的选项。如果您在构建时启用了“编辑并继续”,编译器将生成一个跳转表,该跳转表可以在创建时更新为指向新函数。您看到的指针值可能不同,因为
void
变量指向跳转表中的条目,同时您也在查看dbugger中实际函数的地址。还可以尝试显示真实代码,而不是幻想代码。这可能是虚拟类方法的预期结果,因为所显示的代码显然不是真实的代码,但是幻想代码,因此没有权威的结论。也不要在C++中使用括号内的转换。有四种类型的强制转换:
静态强制转换
常量强制转换
动态强制转换
,以及
重新解释强制转换
。选择你想要的并使用它。插入式强制转换可以执行这些强制转换类型中的任何一种,如果操作中涉及的类型发生更改,则它执行的强制转换可以更改。