[英]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 [compound.types] 第 2 段)。 在早期版本的 C++ 和所有版本的 C 中,沒有明確禁止它,但任何理智的實現都不太可能允許它。
[C 答案]
sizeof(size_t)
可以小於sizeof(int)
嗎?
是的。 size_t
的大小可以小於、大於或與int
相同,因為它們的相對大小/范圍未在 C 中指定 - 只有它們的最小_MAX
值: _MAX
。
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
足夠寬以索引所有數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.