gpt4 book ai didi

c - size_t 与 uintptr_t

转载 作者:太空狗 更新时间:2023-10-29 16:13:42 27 4
gpt4 key购买 nike

C 标准保证 size_t 是可以容纳任何数组索引的类型。这意味着,从逻辑上讲,size_t 应该能够容纳任何指针类型。我在 Google 上发现的一些网站上读到这是合法的和/或应该始终有效:

void *v = malloc(10);
size_t s = (size_t) v;

然后在 C99 中,标准引入了 intptr_tuintptr_t 类型,它们是保证能够保存指针的有符号和无符号类型:

uintptr_t p = (size_t) v;

那么使用size_tuintptr_t有什么区别呢?两者都是无符号的,并且都应该能够容纳任何指针类型,因此它们在功能上看起来是相同的。使用 uintptr_t(或者更好的是 void *)而不是 size_t 是否有真正令人信服的理由,除了清晰度?在一个不透明的结构中,该字段将仅由内部函数处理,有什么理由不这样做吗?

出于同样的原因,ptrdiff_t 是一种能够保存指针差异的有符号类型,因此能够保存大多数指针,那么它与 intptr_t 有何不同?

所有这些类型不是基本上都服务于同一功能的不同版本吗?如果不是,为什么?有什么我不能用其中之一做而我不能用另一个做的?如果是这样,为什么 C99 向该语言添加了两个本质上多余的类型?

我愿意忽略函数指针,因为它们不适用于当前的问题,但请随意提及它们,因为我暗暗怀疑它们将是“正确”答案的核心。

最佳答案

size_t is a type that can hold any array index. This means that, logically, size_t should be able to hold any pointer type

不一定!回到分段式 16 位架构的时代,例如:一个数组可能仅限于单个段(所以 16 位 size_t 就可以)但是你可以有多个段(所以 32 -bit intptr_t 类型将需要选择段以及其中的偏移量)。我知道这些东西在统一可寻址的未分段架构的这些日子里听起来很奇怪,但标准必须满足比“2009 年的正常情况”更广泛的多样性,你知道!-)

关于c - size_t 与 uintptr_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1464174/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com