sizeof(size_t)
可以小于sizeof(int)
吗?
C和/或C ++标准是否保证使用unsigned int
进行数组索引总是安全的?
是,sizeof(size_t)
原则上可以小于sizeof(int)
。我不知道有什么实现是正确的,而且很可能没有实现。我可以想象使用64位int
和32位size_t
的实现。
但是使用unsigned int
为数组建立索引是安全的-只要索引的值在数组长度所施加的范围内即可。仅要求[]
运算符的参数为整数。它不会转换为size_t
。它是根据指针算术定义的,其中+
运算符的一个参数是指针,而另一个参数是任何整数类型。
如果unsigned int
宽于size_t
,则unsigned int
索引值超过SIZE_MAX
几乎肯定会引起问题,因为数组不是那么大。在C ++ 14和更高版本中,明确禁止定义大于SIZE_MAX
字节的类型(3.9.2 [compound.types]段落2)。在早期版本的C ++和所有版本的C中,都没有明确禁止使用它,但是任何理智的实现都不太可能允许它。
[C答案]
sizeof(size_t)
可以小于sizeof(int)
吗?
是。 size_t
的大小可以小于,大于或等于int
,因为它们的相对大小/范围未在C中指定-仅其最小 _MAX
值:65535、32767。
IMO,sizeof(size_t) < sizeof(int)
是unicorn。理论的,但未见。
代码可以使用以下代码来检测此类野兽。
#include <limits.h>
#include <stddef.h>
#if SIZE_MAX < UINT_MAX
#error Unexpected small size_t
#endif
C和/或C ++标准是否保证使用
unsigned int
进行数组索引总是安全的?
C中,编号
示例:小数组只能容忍[0 ... 2]的索引-不管索引的类型如何-不能容忍unsigned
的整个范围。巨大的数组可能是可索引的[0 ... UINT_MAX*42ull
],因此unsigned
无法抑制所有有效索引。
size_t
的宽度足以索引所有数组。