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

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

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

C++ C
拉丁的传说 2019-09-21 14:12:58
我已经读过,在大多数平台上都可以将函数指针转换为数据指针,反之亦然,但不能保证能正常工作。为什么会这样呢?难道两个都不都是简单地寻址到主存储器并因此兼容吗?
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

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


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

TA贡献1877条经验 获得超1个赞

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


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


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

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


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

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


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


查看完整回答
反对 回复 2019-09-21
  • 3 回答
  • 0 关注
  • 690 浏览

添加回答

举报

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