[解決済み】size_tとuintptr_tの比較
質問
C言語規格は次のことを保証しています。
size_t
は、任意の配列インデックスを保持することができる型です。これはつまり、論理的には
size_t
は、どんなポインタ型でも保持できるはずです。Googleで見つけたいくつかのサイトでは、これは合法であり、かつ/または、常に動作するはずだと書いてありました。
void *v = malloc(10);
size_t s = (size_t) v;
そこで、C99では、標準に
intptr_t
と
uintptr_t
これは、ポインタを保持できることが保証された符号付きおよび符号なしタイプです。
uintptr_t p = (size_t) v;
では
size_t
と
uintptr_t
? どちらも符号なし、どちらもどんなポインタ型でも保持できるはずなので、機能的には同じように見えます。を使うべき本当に説得力のある理由があるのでしょうか?
uintptr_t
(いっそのこと
void *
ではなく
size_t
明確であること以外には?不透明な構造で、フィールドが内部関数によってのみ処理される場合、これを行わない理由がありますか?
同じ意味で
ptrdiff_t
はポインタの差分を保持することができる符号付き型であり、したがってほとんどのポインタを保持することが可能であったので、どのように
intptr_t
?
これらのタイプは、基本的に同じ機能の些細な異なるバージョンを提供していないのでしょうか?もしそうでないなら、なぜですか?このうちの一つでできなくて、別のものでできることは何でしょうか?もしそうなら、なぜC99は本質的に余分な2つの型を言語に追加したのでしょうか?
関数ポインタは今回の問題には当てはまらないので無視しても構いませんが、quot;correct"の答えの中心になるのではないかと思うので、遠慮なく言及してください。
解決方法は?
<ブロッククオート
size_t
は、任意の配列インデックスを保持することができる型です。ということです。
論理的には、size_t は
任意のポインタ型を保持する
必ずしもそうではありません。 例えば、セグメント化された16ビット・アーキテクチャの時代を思い出してください:配列は1つのセグメントに制限されているかもしれません(だから16ビット
size_t
しかし、複数のセグメントを持つことができます。
intptr_t
タイプは、セグメントとその中のオフセットを選択するために必要です。) しかし、標準規格は、2009年に一般的とされるものよりも幅広い種類に対応しなければならないのです。)
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】変数の警告が設定されているが使用されていない
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】0LLや0x0ULの意味は何ですか?
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み】C言語におけるsize_tとは?
-
[解決済み】符号なし整数のオーバーフローは定義されているのに、符号あり整数のオーバーフローは定義されていないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】 strcpyとstrdupの比較
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み] struct で "warning: useless storage class specifier in empty declaration" (警告: 空の宣言での無駄なストレージクラス指定子)
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み] テスト
-
[解決済み] struct has no member named
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み] '{'トークンの前に期待される式