sizeof(size_t) 可以小于 sizeof(int) 吗?
Can sizeof(size_t) be less than sizeof(int)?
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
宽,那么超过SIZE_MAX
的unsigned int
索引值几乎肯定会引起问题,因为数组不是那么大。在 C++14 及更高版本中,明确禁止定义大于SIZE_MAX
字节的类型(3.9.2 [复合类型] 第 2 段;C++17 中的第 6.9.2 节(。在早期版本的 C++ 和所有版本的 C 中,它没有被明确禁止,但任何健全的实现都不太可能允许它。
[C 答案]
sizeof(size_t)
可以小于sizeof(int)
吗?
是的。size_t
的大小可以小于、大于或等于int
,因为它们的相对大小/范围未在 C 中指定 - 仅指定其最小_MAX
值:65535、32767。
IMO,sizeof(size_t) < sizeof(int)
是独角兽。 理论上的,但看不到。
代码可以使用以下内容来检测此类野兽。
#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
的宽度足以索引所有数组。
- sizeof(size_t) 可以小于 sizeof(int) 吗?
- 在 <char>sizeof(int) == 1 的平台中如何编码 char_traits::eof() ?
- 如何理解"vector<int> avector (arr, arr + sizeof(arr) / sizeof(arr[0]) )"?
- sizeof(int(123)) 是什么意思?
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- x = malloc(n * sizeof (int));无法将 void 转换为 int
- 为什么sizeof int是错误的,而sizeof(int)是正确的
- "new int[5]"和"malloc(5 * sizeof(int))"之间的C++有什么区别?
- C/C++:在32位机器上的sizeof(short)、sizeof(int)、sizeof(long)、size of
- C/C++:包含 int 和枚举的 typedef 结构的大小 == sizeof(int)
- 为什么 sizeof(int) 与 sizeof(int*) 不同
- 如何理解"C++ allows sizeof(char*) != sizeof(int*)"?
- 在这种情况下,sizeof(int) 返回什么
- 在32位或64位平台上,sizeof(int)=1
- 将-1移位到sizeof(int)在C++中生成两个不同的结果
- sizeof(int)是否始终等于sizeof(void*)
- 为什么C#中的sizeof(int*)=8,C++中的sizeof[int*]=4
- 当sizeof(int)=sizeof(long)时,long优于int的任何情况
- sizeof(int) >= 2 和 sizeof(long) >= 4 : 对于任何实现,这总是正确的吗?
- c++: sizeof(int[3])中的int[3]是什么?