其他分享
首页 > 其他分享> > c-为什么函数指针都具有相同的值?

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