VS2015调试器监视窗口为何无法正确显示函数地址?
函数地址在VS调试器与cout输出不一致的原因
这个问题其实是C++函数名的隐式转换规则,加上Visual Studio 2015调试器的特殊显示逻辑共同导致的,我来给你拆解清楚:
1. 为什么cout输出三者地址一致?
在C++标准中,函数名在表达式中会自动隐式转换为指向该函数的指针。也就是说:
printStuff(函数名)会被编译器自动转换成void(*)(float)类型的函数指针,指向函数的实际代码入口&printStuff是显式取函数的地址,得到的也是同一个函数指针- 你把
printStuff赋值给functionPointer后,这个指针变量自然也存储了同一个地址
所以当你用cout输出这三个值时,它们本质上都是同一个函数指针的地址,结果自然完全一致。
2. 为什么VS调试器的监视窗口显示不一致?
Visual Studio 2015的调试器在处理监视窗口的表达式时,对函数名的显示做了特殊处理:
- 当你查看
functionPointer时,调试器直接读取这个指针变量存储的值,也就是函数的实际代码入口地址,和cout输出一致 - 当你查看
printStuff或&printStuff时,调试器并没有按照C++表达式的规则将它们转换为函数指针,而是显示了函数的符号信息/调试元数据对应的地址(而非实际的代码入口地址)。这是调试器为了方便关联调试信息做的特殊处理,并非程序运行时的实际值。
验证方法
你可以在监视窗口中尝试输入强制转换后的表达式:(void(*)(float))printStuff,这时候显示的地址就会和functionPointer以及cout输出的地址完全一致了。
3. 对程序运行的影响
不用担心,这个差异只是调试器的显示问题,程序运行时的函数指针是完全正确的——你调用functionPointer(PI)能正常输出函数内容,就证明了这一点,实际的函数调用并没有受到调试器显示的影响。
内容的提问来源于stack exchange,提问作者P. Zhang
相关产品推荐
相关产品推荐

