C语言实现中是否必须满足sizeof(void*) >= sizeof(size_t)?
关于
sizeof(void*) >= sizeof(size_t)的推导合理性解答 结论
你的推理并不合理,C语言标准从未要求sizeof(void *) >= sizeof(size_t),现实中也存在大量合法的C实现不符合这一结论。
推理存在的核心漏洞
你推导的核心前提「最大对象的每个字节都对应唯一的void*取值,void*可表示的不同值数量至少等于size_t的最大值」本身不是C标准的强制要求:
- C标准只规定
size_t是可以表示任意对象字节大小的无符号整数类型,其最大值SIZE_MAX对应实现支持的单个对象最大字节数 - 标准仅要求指向对象的指针可以转换为
char*、首字节指针加偏移量可以得到后续字节的指针,但既没有要求不同字节的指针必须有不同的数值表示,也没有要求void*的取值范围要覆盖所有可能的字节偏移量。
实际反例
字寻址架构的DSP实现就是典型的反例:
- 这类架构的最小可寻址单元是16位字,不是单字节,因此
void*(对象指针)只需要表示字地址,宽度为16位,sizeof(void*) = 2 - 为了兼容C标准中
char占1字节的要求,这类实现会把char的位宽定义为16位,同时为了支持更大的对象字节计数,会把size_t定义为32位无符号整数,sizeof(size_t) = 4 - 这种实现完全符合C标准要求,但
sizeof(void*) < sizeof(size_t),直接推翻了你推导的结论。
内容的提问来源于stack exchange,提问作者Mark Galeck
相关产品推荐
相关产品推荐

