- ベストアンサー
ポインタ変数のサイズ
- C言語におけるポインタ変数のサイズについて調査しました。
- 実行結果から、char型へのポインタとint型へのポインタのサイズは共に4バイトであることが分かりました。
- また、ポインタ変数の初期値についても調査しました。char型へのポインタの初期値は-60であることが分かりました。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
1) ポインタ変数とは、アドレスを保持する変数です。 ですから、ポインタの先に、int であろうが、char であろうが、平安京エイリアンであろうが、なにが、ぶらさがっていても、ポインタ変数の中身は、アドレスです。 ですから、 sizeof s1, sizeof s2 は、そのマシンのアーキテクチャできまる、アドレスを保持するサイズです。4ということは、32bitマシンなのでしょう。 2) printf("s1 = %d\n", s1); は、コンパイラにとっては、 s1で、ポイントされる1バイトを符号付きcharとし、 それを、intに拡張して、printfの第2引数として、渡す、ということです。 printfは、第1引数の書式指定に従い、第2引数を、intとして、プリントする ということです。それで、-60 と表示されたのは、元の1バイトも、-60. すなわち、-60 とは、11010000 == 0xd0 が、s1のポイントしているアドレスにあったということです。 mallocで割り当てられる領域は、ヒープ領域と呼ばれますが、ここは、初期化していない限り、値について 仮定を置くことは出来ません。同じコンパイラ環境で、ヒープの先頭なので、その辺は、0xd0になっていることが 多いといことだけの話です。s1とs2のallocの順番を逆にすれば、s2の方が定値になりやすいでしょう。 ですから、ちがう環境、たとえば、cygwin や、bcc32 あるいは、Xcode/Macなどでは、同一ソースでも、違う結果になるでしょう。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
あと一応突っ込んでおくと char 自体が符号付きか符号なしかは処理系定義です. Visual Studio (というか Visual C) では標準は符号付きですが, コンパイラオプションで符号なしにもできます.
お礼
処理系依存ですか。またいろいろ実験してみます。ありがとうございました。
再び、#1の回答者です。間違い指摘ありがとう>#2 #1の回答の後半は、 □printf("*s1 = %d\n", *s1); についての解説のことです。
お礼
ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
printf("s1 = %d\n", s1); で「s1で、ポイントされる1バイト」はでてきませんぜ>#1. 単に 変数 s1 に入っている値を int と思って出力する だけ. ちなみにポインタ変数の値を %d で出すのは未定義動作だから, 突然 PC で平安京エイリアンが動きだしても文句はいえない (と #1 に乗ってみる).
お礼
補足をありがとうございました。
お礼
xpd154様、誠にありがとうございます。非常に明快に、また丁寧にご教授くださいました。大変感謝いたします。よく勉強します。ありがとうございました。