有关函数指针大小的保证是什么?

时间:2010-10-15 11:30:06

标签: c pointers type-conversion function-pointers sizeof

在C中,我需要知道结构的大小,其中包含函数指针。我可以保证在所有平台和架构上:

  • void *的大小与函数指针的大小相同吗?
  • 函数指针的大小因返回类型而没有差异?
  • 函数指针的大小因其参数类型而没有差异?

我认为所有这些答案都是肯定的,但我想确定。对于上下文,我正在调用sizeof(struct mystruct),仅此而已。

4 个答案:

答案 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位函数指针,而“紧凑”存储器模型却是另一回事。