首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么函数指针和数据指针在C/C++中不兼容?

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

Stack Overflow用户
提问于 2012-09-11 04:21:40
回答 9查看 13.8K关注 0票数 134

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-09-11 04:26:04

架构不必将代码和数据存储在同一内存中。在哈佛架构中,代码和数据存储在完全不同的内存中。大多数架构都是Von Neumann架构,代码和数据在同一内存中,但如果可能的话,C语言并不局限于某些类型的架构。

票数 175
EN

Stack Overflow用户

发布于 2012-09-11 05:04:35

对于那些记得MS-DOS、Windows3.1和更早版本的人来说,答案非常简单。所有这些都用于支持几种不同的内存模型,代码和数据指针的特征组合各不相同。

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

代码语言:javascript
复制
sizeof(void *) > sizeof(void(*)())

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

代码语言:javascript
复制
sizeof(void *) < sizeof(void(*)())

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

此外,即使指针大小相同,也不能保证它们指向相同的东西-在DOS小内存模型中,代码和数据都在指针附近使用,但它们指向不同的段。因此,将函数指针转换为数据指针根本不会给出与函数有任何关系的指针,因此这样的转换没有任何用处。

票数 31
EN

Stack Overflow用户

发布于 2011-02-08 02:00:56

指向void的指针应该能够容纳指向任何类型数据的指针--但不一定是指向函数的指针。有些系统对函数指针的要求与对数据指针的要求不同(例如,有些DSP对数据和代码的寻址不同,MS-DOS上的medium型号对代码使用32位指针,但只对数据使用16位指针)。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12358843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档