C++ sizeof(size\u t)能否小于sizeof(int)?

C++ sizeof(size\u t)能否小于sizeof(int)?,c++,c,language-lawyer,sizeof,size-t,C++,C,Language Lawyer,Sizeof,Size T,sizeof(size\u t)能否小于sizeof(int) < > C和/或C++标准保证使用无符号INT/COM>数组索引总是安全的吗?< /P> < P>是的, siZeof(SiZeIt)< /C>原则上可以小于 sieOf(int)< /C>。我不知道有哪种实现是这样的,而且很可能没有。我可以想象一个64位int和32位size\u t的实现 但是使用unsigned int对数组进行索引是安全的——只要索引的值在数组长度规定的范围内。[]运算符的参数仅要求为整数。它不会转换为大小\

sizeof(size\u t)
能否小于
sizeof(int)

< > C和/或C++标准保证使用<代码>无符号INT/COM>数组索引总是安全的吗?< /P> < P>是的,<代码> siZeof(SiZeIt)< /C>原则上可以小于 sieOf(int)< /C>。我不知道有哪种实现是这样的,而且很可能没有。我可以想象一个64位
int
和32位
size\u t
的实现

但是使用
unsigned int
对数组进行索引是安全的——只要索引的值在数组长度规定的范围内。
[]
运算符的参数仅要求为整数。它不会转换为
大小\u t
。它是用指针算法定义的,其中
+
运算符有一个指针参数和一个任意整数类型的参数

如果
unsigned int
大于
size\u t
,那么
unsigned int
索引值超过
size\u MAX
几乎肯定会导致问题,因为数组没有那么大。在C++14及更高版本中,明确禁止定义大于
SIZE_MAX
字节的类型(3.9.2[component.types]第2段)。在C++的早期版本中,在所有版本的C中,它没有明确禁止,但不太可能任何明智的实现都允许它。

[C回答]

sizeof(size\u t)
能否小于
sizeof(int)

对。
size\u t
的大小可以小于、大于或等于
int
,因为它们的相对大小/范围没有在C中指定-只有它们的最小值
\u MAX
值:65535、32767

在国际海事组织中,
sizeof(size\u t)
是一个标准。理论上,但没有看到

代码可以使用以下代码来检测此类动物

#include <limits.h>
#include <stddef.h>
#if SIZE_MAX < UINT_MAX
  #error Unexpected small size_t
#endif
#包括
#包括
#如果尺寸_MAX
< > C和/或C++标准保证使用<代码>无符号int >代码>数组索引总是安全的吗? 在C中,不是

示例:一个小数组可能只允许[0…2]的索引-无论索引的类型如何-而不是整个范围的
无符号
。一个巨大的数组可能是可索引的[0…
UINT_MAX*42ull
],因此
无符号的
不能代表所有有效的索引


大小\u t
足够宽,可以索引所有数组。

为什么使用
无符号int
不安全?数组索引不能为负。您是否曾经计划过使用如此多的数组元素来溢出
无符号int
?从技术上讲,
sizeof(size\u t)
可能大于
sizeof(int)
(也就是说,如果
size\u t
在64位系统上是
unsigned long
),但我怀疑你会发现它会更小。@RemyLebeau我见过一些Java世界的人认为数组索引必须是
int
。也许NoSkill也有类似的困惑?我想你误解了这个问题。他想知道
unsigned int
的范围是否太大。e、 g.
size\u t==unsigned char
@RemyLebeau:数组索引可以是负数。例如:
intarr[10];int*ptr=arr+5;ptr[-5]=0
完全有效。@RemyLebeau:
[]
运算符是根据指针算术定义的。指针需要指向数组对象的元素(包括被视为1元素数组的非数组对象)。如果“数组索引”指的是相对于指针指向的数组对象的基的索引,那么你是对的,但标准没有用这些术语来描述它。此外,如果对象的大小确实被限制为可以用
大小\u t
表示的值,那么原始问题是有意义的,类型为
size\u t
的索引可以表示至少一个超出每个数组界限的值。对于实际程序中实际观察到的几乎所有数组,
size\u t
可以表示很多越界索引。它与存在的对象的最大可能大小的关联并不能使索引更安全。“支持大于size\u MAX元素的数组的实现几乎肯定会使size\u t更大。”目前尚不清楚。您的意思是“支持多于UINT_MAX元素的数组的实现…”?与任何对象一样,数组的大小小于或等于
size\u MAX
。我怀疑这是C++的。@ CHEX RealStimeNoCICA不,我是指代码> siZeXMAX < /代码>。C没有明确要求对象不能大于
SIZE\u MAX
字节。例如,一个C实现可以有32位
size\u t
但允许233个元素数组——那么
sizeof obj
可能会溢出。显而易见的解决方案是这样一个实现,使其
大小\u t
足够大,可以容纳任何对象的大小。显然这不适用于C++14及更高版本。Keith,谢谢。“sizeof
运算符产生其操作数的大小(以字节为单位)”,也可以理解为“C没有明确要求对象可以大于
SIZE\u MAX
。我承认,无论哪种方式,这都不是明确的关于可以/不能更大。。。但言下之意,国际海事组织是无法做到的。看起来这是个很好的问题。@chux,如果能明确地说出来,那就太好了。但是我不知道32位的代码< SigZiTu< /Cux>允许2×33个元素数组的实现会违反C(或C++ 2014之前)标准中的任何要求。可能这是作者没有想到的一个案例。IMHO
sizeof…
可以像任何其他算术表达式一样溢出。