c-为什么函数指针都具有相同的值?
作者:互联网
例如:
using namespace std;
#include <iostream>
void funcOne() {
}
void funcTwo( int x ) {
}
int main() {
void (*ptrOne)() = funcOne;
cout << ptrOne << endl; //prints 1
void (*ptrTwo)( int x ) = funcTwo;
cout << ptrTwo << endl; //prints 1
int (*ptrMain)() = main;
cout << ptrMain << endl; //prints 1
}
有人知道这背后的原因吗?起初我以为是因为我从没调用过这些函数,所以它们不存在于内存中,因此它们也从未添加到堆栈中.但是,即使指向主函数的指针的值也会打印出1.
解决方法:
函数指针不会隐式转换为void *,即运算符<<超载. 这在C 11§4.10/ 2中通过省略指定:
A prvalue of type “pointer to cv T,” where T is an object type, can be converted to a prvalue of type “pointer to cv void”. The result of converting a “pointer to cv T” to a “pointer to cv void” points to the start of the storage location where the object of type T resides, as if the object is a most derived object (1.8) of type T (that is, not a base class subobject). The null pointer value is converted to the null pointer value of the destination type.
函数类型不是对象类型.
而且,您甚至无法使用static_cast做到这一点.函数和对象可能生活在完全不同的地址空间(这称为哈佛体系结构)中,并且指针大小不同.可以使用reinterpret_cast将函数指针转换为void *:它是“有条件支持的”(C 11§5.2.10/ 8).这样的void *仅应用于打印或转换回原始函数指针类型.
标签:c,function-pointers 来源: https://codeday.me/bug/20191012/1900045.html