首页 > 解决方案 > 指针大小可以是 4.75 字节吗

问题描述

考虑一个总可用内存为 2^(38) 字节的系统。用户在这个系统上编写一个使用整个寻址空间的 C 程序。这个 C 程序中定义的指针的大小(以字节为单位)是多少。

标签: c

解决方案


在 C 中,一个字节是一个基本单位。字节中的位数由每个单独的 C 实现定义。(八位现在很常见,但不是强制性的。这是最低要求。)

根据 C 2018 6.2.6.1 2,除了位字段,每个对象都由一个或多个字节组成。因此,指针在其 C 实现中必须是整数字节数,尽管指针中的某些位可能未使用。

指针使用的字节数最终由 C 实现决定,而不是由运行其程序的计算机或系统决定。总的来说,C 旨在被配置为“自然地”适应系统,因此指针和其他类型往往与机器的设计目标相匹配。但是,C 实现有时服务于特殊目的,例如支持旧源代码或仅提供一部分内存以节省资源。例如,在具有 64 位地址空间的机器上,我们可以选择使用 32 位 C 实现,因为 64 位指针占用的空间量是执行某些程序的重要成本。

因此,在具有 2个 38字节内存的系统上,需要 38 位来寻址每个字节。这导致了几种可能性,包括:

  • 该系统有 8 位字节,C 实现使用 5 字节(40 位)指针,其中 38 位表示一个地址,另外两个可能被浪费或可用于某些错误检测或其他功能。
  • 系统有八位字节,对齐有一些好处,所以C实现使用八字节指针。
  • 假设系统有 19 位字节,C 实现使用其中两个作为指针。
  • 系统有八位字节,C 实现使用四字节指针。每个 C 程序的地址空间中只有 2 32字节可用,尽管不同的 C 程序可能使用内存中 2 38字节的不同部分。

推荐阅读