为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

C++ C
拉丁的传说 2019-09-21 14:12:58

我已经读过,在大多数平台上都可以将函数指针转换为数据指针,反之亦然,但不能保证能正常工作。为什么会这样呢?难道两个都不都是简单地寻址到主存储器并因此兼容吗?



查看完整描述

3 回答

?
智慧大石

架构不必将代码和数据存储在同一内存中。使用哈佛架构,代码和数据存储在完全不同的内存中。大多数体系结构都是冯·诺依曼体系结构,其中代码和数据位于同一内存中,但是C绝不将自身限制为仅某些类型的体系结构。


查看完整回答
反对 回复 2019-09-21
?
慕仰0522570

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

该语言不仅为当前的桌面应用程序设计,而且允许在大量硬件上实现。


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

C99基本原理说:

6.3.2.3指针
C现在已在多种体系结构上实现。尽管其中一些体系结构具有统一的指针,这些指针的大小是某些整数类型的大小,但是最大的可移植代码无法假定不同指针类型和整数类型之间的任何必要的对应关系。在某些实现中,指针甚至可以比任何整数类型都宽。

使用void*(“指向的指针void”)作为通用对象指针类型是C89委员会的一项发明。指定函数原型参数的愿望刺激了采用这种类型,该函数要么安静地转换任意指针(如fread),要么抱怨参数类型不完全匹配(如strcmp)。没有提到关于函数的指针,这可能与对象指针和/或整数不符。

注意在上一段中没有提到任何有关函数的指针。它们可能与其他指标有所不同,委员会对此有所了解。


查看完整回答
反对 回复 2019-09-21
?
冉冉说

对于那些记得MS-DOS,Windows 3.1和更早版本的人,答案很简单。所有这些用于支持几种不同的内存模型,并具有代码和数据指针的特征的不同组合。


因此,例如对于紧凑模型(小代码,大数据):


sizeof(void *) > sizeof(void(*)())

相反,在中型模型中(大代码,小数据):


sizeof(void *) < sizeof(void(*)())

在这种情况下,您没有代码和日期的单独存储,但是仍然无法在两个指针之间进行转换(缺少使用非标准的__near和__far修饰符)。


另外,不能保证即使指针大小相同,它们也指向同一事物-在DOS小型内存模型中,代码和数据都在指针附近使用,但它们指向的是不同的段。因此,将函数指针转换为数据指针根本不会给您一个与该函数有任何关系的指针,因此这种转换毫无用处。


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信