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

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



拉丁的传说
浏览 725回答 3
3回答

智慧大石

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

冉冉说

对于那些记得MS-DOS,Windows 3.1和更早版本的人,答案很简单。所有这些用于支持几种不同的内存模型,并具有代码和数据指针的特征的不同组合。因此,例如对于紧凑模型(小代码,大数据):sizeof(void *) > sizeof(void(*)())相反,在中型模型中(大代码,小数据):sizeof(void *) < sizeof(void(*)())在这种情况下,您没有代码和日期的单独存储,但是仍然无法在两个指针之间进行转换(缺少使用非标准的__near和__far修饰符)。另外,不能保证即使指针大小相同,它们也指向同一事物-在DOS小型内存模型中,代码和数据都在指针附近使用,但它们指向的是不同的段。因此,将函数指针转换为数据指针根本不会给您一个与该函数有任何关系的指针,因此这种转换毫无用处。
打开App,查看更多内容
随时随地看视频慕课网APP