3 回答
TA贡献1993条经验 获得超5个赞
size_t
是一种可以保存任何数组索引的类型。这意味着,逻辑上,size_t应该能够保存任何指针类型
不必要!回到分段16位架构的时代,例如:一个阵列可能仅限于一个段(所以16位size_t
会这样做)但是你可能有多个段(所以需要一个32位的intptr_t
类型来挑选细分及其内部的偏移)。我知道这些事情听起来很奇怪,在这些日子里,统一可寻址的未分段架构,但标准必须提供比“2009年正常情况”更广泛的品种,你知道! - )
TA贡献1831条经验 获得超10个赞
关于你的陈述:
“C标准保证这
size_t
是一种可以保存任何数组索引的类型。这意味着,逻辑上,它size_t
应该能够保存任何指针类型。”
这实际上是一种谬误(由于错误的推理造成的误解)(a)。你可能认为后者是从前者开始的,但事实并非如此。
指针和数组索引不是一回事。设想一个将数组限制为65536个元素的符合实现但允许指针将任何值寻址到一个巨大的128位地址空间中是非常合理的。
C99表示size_t
变量的上限由下定义,SIZE_MAX
并且可以低至65535(参见C99 TR3,7.18.3,在C11中不变)。如果在现代系统中将指针限制在此范围内,则指针将相当有限。
在实践中,您可能会发现您的假设成立,但这不是因为标准保证了它。因为它实际上并不能保证它。
(a)顺便说一下,这不是某种形式的人身攻击,只是说明为什么你的陈述在批判性思维的背景下是错误的。例如,以下推理也无效:
所有的小狗都很可爱。这件事很可爱。因此,这件事必须是一只小狗。
puppiess的可爱或其他方面在这里没有任何影响,我所说的只是两个事实并不能得出结论,因为前两个句子允许存在不是小狗的可爱东西。
这类似于你的第一个陈述,不一定强制要求第二个陈述。
TA贡献1852条经验 获得超1个赞
我会让所有其他答案代表片段限制,异国情调架构等的推理。
名称的简单差异是不是足以使用正确的类型来做正确的事情?
如果您要存储尺寸,请使用size_t
。如果您要存储指针,请使用intptr_t
。阅读代码的人会立即知道“啊哈,这是一个大小的东西,可能以字节为单位”,“哦,这里的指针值由于某种原因存储为整数”。
否则,您可以使用unsigned long
(或者,在这些现代时代unsigned long long
),用于所有事情。大小不是一切,类型名称带有有用的含义,因为它有助于描述程序。
- 3 回答
- 0 关注
- 518 浏览
添加回答
举报