为什么C/C++中函数指针和数据指针不兼容?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (54)

我已经读过,将函数指针转换为数据指针,反之亦然,在大多数平台上工作,但不能保证工作。为什么会这样?不应该都是简单地址到主内存中,因此是兼容的吗?

提问于
用户回答回答于

架构不必将代码和数据存储在同一内存中。采用哈佛架构,代码和数据存储在完全不同的内存中。大多数体系结构都是代码和数据在同一内存中的冯诺依曼体系结构,但如果可能的话,C不会仅限于某些类型的体系结构。

用户回答回答于

一些计算机具有用于代码和数据的单独地址空间。在这样的硬件上它不起作用。

该语言不仅适用于当前的桌面应用程序,而且允许在大量硬件上实施。

看起来C语言委员会从来没有打算void*成为一个函数指针,他们只是想要一个指向对象的通用指针。

C99理由说:

6.3.2.3指针 C现在已经在各种架构上实现。虽然其中一些体系结构具有统一指针,这些指针是某种整数类型的大小,但最大可移植代码无法假定不同指针类型和整数类型之间的任何必要对应关系。在一些实现中,指针甚至可以比任何整数类型更宽。 使用void*(“指向void”)作为通用对象指针类型是C89委员会的发明。这种类型的采用受到指定函数原型参数的渴望的刺激,该参数要么静静地转换任意指针(如在fread)中,要么在参数类型不完全匹配(如在strcmp)时抱怨。没有关于函数指针的说法,它可能与对象指针和/或整数不相称。

注意最后一段中没有关于函数指针的说明。他们可能与其他指针不同,委员会知道这一点。

扫码关注云+社区