在C中,我需要知道结构的大小,其中包含函数指针。我可以保证在所有平台和架构上:
我认为所有这些答案都是肯定的,但我想确定。对于上下文,我正在调用sizeof(struct mystruct)
,仅此而已。
答案 0 :(得分:30)
从C99规范,第6.2.5节,第27段:
指向void的指针应具有相同的指针 表示和对齐 要求作为指针 字符类型。同样,指针 对于合格或不合格的版本 兼容类型应具有相同的 表示和对齐 要求。所有指针 结构类型应具有相同的 表示和对齐 彼此的要求。所有 联合类型的指针应具有 相同的表示和对齐 彼此的要求。指针 其他类型不必相同 表示或对齐 要求。
所以没有;不能保证void *
可以保存函数指针。
第6.3.2.3节第8段:
指向一种类型函数的指针 可以转换为指向a的指针 另一种类型和背部的功能 再次;结果应该相等 到原始指针。
暗示一个函数指针类型可以包含任何其他函数指针值。从技术上讲,这与保证函数指针类型的大小不能相同,只是它们的值占据相同的范围是不一样的。
答案 1 :(得分:14)
不,不,不。
C不支持具有不同代码和数据指针大小的哈佛架构,因为理想情况下,在为这样的架构编程时,您希望将数据存储在程序存储器中(字符串文字等),并且这样做是您需要的对象指针进入代码空间。但它并没有禁止它们,所以就标准而言,函数指针可以引用一个与数据地址空间大小不同的地址空间。
但是,任何函数指针都可以转换为另一个函数指针类型[*]并返回而不会丢弃该值,这与将任何对象指针强制转换为void*
并返回的方式相同。因此,根据其签名,函数指针的大小会有所不同,这将是相当令人惊讶的。对于额外的空间没有明显的“使用”,如果你必须能够以某种方式在较小的空间中存储相同的值,然后在退回时检索它。
[*]谢谢,schot。
答案 2 :(得分:8)
除了其他答案,维基百科说:
http://en.wikipedia.org/wiki/Function_pointer
虽然C和C中的函数指针 C ++可以很简单地实现 地址,通常
sizeof(Fx)==sizeof(void *)
,成员 经常实现C ++中的指针 作为“胖指针”,通常是两个或者 简单的三倍大小 函数指针,以便处理 虚拟继承。
函数指针是一种抽象。只要满足标准的要求,任何事情都是可能的。即如果程序中的函数少于256个,则函数指针可以通过使用值为0的单个字节实现NULL,将值1到255作为具有物理地址的表的索引来实现。如果超过255个函数,则可以扩展为使用2个字节。
答案 3 :(得分:2)
有一个常见的不同尺寸的实际例子。在MS-DOS&早期的Windows C编程,在“中”存储器模型中,你有16位数据指针但是有32位函数指针,而“紧凑”存储器模型却是另一回事。