C言語のsize_t
について混乱しています。sizeof
演算子で返されることは知っています。しかし、それは正確には何なのでしょうか?データ型なのでしょうか?
例えば,for
ループがあるとしましょう。
for(i = 0; i < some_size; i++)
int i;と
size_t i;`のどちらを使うべきでしょうか?
1999年のISO C規格によると
1999年のISO C規格(C99)では、size_t
は少なくとも16ビットの符号なし整数
1999年のISO C規格(C99)では、size_t
は少なくとも16ビットの符号なし整数型です(セクション
7.17および7.18.3参照)。
size_t
は、いくつかのC/C++で定義されている符号なしのデータ型です。size_t
は、いくつかのC/C++標準で定義されている符号なしのデータ型です。
size_t
は、いくつかのC/C++標準で定義されている符号なしのデータ型です。 C99 ISO/IEC 9899規格など、いくつかのC/C++規格で定義されている符号なしのデータ型で、stddef.h
で定義されています1。 さらに、以下のようにインポートすることができます。 さらに、stdlib.h
をインクルードすることでもインポートできます。stddef.h
をインクルードします。オブジェクトのサイズを表すための型です。 オブジェクトのサイズを表すのに使われます。ライブラリ関数 サイズを受け取ったり、返したりするライブラリ関数は、サイズが size_t
の型または戻り値の型であることが期待されます。 size_t
であることを期待しています。さらに、最も 頻繁に使用されるコンパイラベースの 演算子 sizeof は、次のように評価されます。 と互換性のある定数値に評価されなければなりません。 size_t`.
暗黙の了解として、size_t
は任意の配列インデックスを保持することが保証されている型です。
size_tは、符号なしの型である。 そのため、負の値(<0)を表すことはできません。 何かを数えていて、それが負の値にならないと確信しているときに使います。 例えば、[strlen()
]1はsize_t
を返しますが、これは文字列の長さが少なくとも0でなければならないからです。
あなたの例では,ループのインデックスが常に0よりも大きくなる場合,size_t
やその他の符号なしのデータ型を使用することに意味があるかもしれません。
size_t` オブジェクトを使用する際には、算術演算を含むすべての使用状況において、非負の値が必要であることを確認する必要があります。 例えば、'としましょう。
size_t s1 = strlen(str1);
size_t s2 = strlen(str2);
で、str2
とstr1
の長さの差を求めたいとします。 できません。
int diff = s2 - s1; /* bad */
これは、diff
に代入される値は、たとえ s2 < s1
であっても、符号なしの型で計算されるので、常に正の数になるからです。 この場合、ユースケースにもよりますが、s1
と s2
には int
(または long long
) を使用したほうがよいでしょう。
C/POSIXの関数の中には、size_t
を使える/使うべきだが、歴史的な理由で使えないものがあります。 例えば、fgets
の2番目のパラメータは、理想的には size_t
であるべきですが、int
です。