sizeof(size_t)是否小于sizeof(int)?

问题描述 投票:2回答:2

sizeof(size_t)可以小于sizeof(int)吗?

C和/或C ++标准是否保证使用unsigned int进行数组索引总是安全的?

c++ c language-lawyer sizeof size-t
2个回答
6
投票

是,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中,都没有明确禁止使用它,但是任何理智的实现都不太可能允许它。


1
投票

[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的宽度足以索引所有数组。

© www.soinside.com 2019 - 2024. All rights reserved.