sizeof指针在同一架构上的数据类型不同

Clo*_*oud 5 c pointers sizeof

我一直在浏览一些帖子,并注意到指针可以根据sizeof代码编译和运行的体系结构而有不同的大小.对我来说似乎足够合理(即:32位架构上的4字节指针,64位上的8字节,完全有意义).

让我感到惊讶的一件事是指针的大小可以根据它指向的数据类型而有所不同.我认为,在32位体系结构中,所有指针的大小都是4个字节,但事实证明,函数指针可以是不同的大小(即:大于我预期的大小).为什么这是C编程语言?我找到了一篇文章解释了这个C++,以及程序如何处理虚函数,但这似乎不适用于纯C.此外,似乎使用"远"和"近"指针是不再需要,所以我没有看到那些进入等式的人.

那么,在C中,什么理由,标准或文档描述了为什么不是所有指针在同一架构上都是相同的大小?

谢谢!

Ded*_*tor 6

C标准规定了所要求的法律:

  • 所有数据指针都可以转换void*回来,而不会丢失信息.
  • 所有struct指针具有相同的表示+对齐,因此可以相互转换.
  • 所有union指针具有相同的表示+对齐,因此可以相互转换.
  • 所有字符指针和void指针都具有相同的表示+对齐.
  • 所有指向限定和非限定兼容类型的指针都应具有相同的表示+对齐.(例如,相同类型的未签名/签名版本兼容)

  • 所有函数指针都具有相同的表示+对齐,并且可以转换为任何其他函数指针类型并再次返回.

不需要更多.
委员会通过检查所有当前的实施和机器并尽可能多地编纂保证来达到这些保证.

在指针自然是单词指针而不是字符指针的架构上,您可以获得不同大小的数据指针.
在具有不同大小的代码/数据空间(许多微处理器)的架构上,或者需要额外信息来正确调用函数(如itanium,尽管它们经常隐藏在数据指针后面),您可以获得不同大小的代码指针.数据指针.