• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ポインタ変数のサイズ)

ポインタ変数のサイズ

このQ&Aのポイント
  • C言語におけるポインタ変数のサイズについて調査しました。
  • 実行結果から、char型へのポインタとint型へのポインタのサイズは共に4バイトであることが分かりました。
  • また、ポインタ変数の初期値についても調査しました。char型へのポインタの初期値は-60であることが分かりました。

質問者が選んだベストアンサー

  • ベストアンサー
noname#190876
noname#190876
回答No.1

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などでは、同一ソースでも、違う結果になるでしょう。

awa3yee
質問者

お礼

xpd154様、誠にありがとうございます。非常に明快に、また丁寧にご教授くださいました。大変感謝いたします。よく勉強します。ありがとうございました。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

あと一応突っ込んでおくと char 自体が符号付きか符号なしかは処理系定義です. Visual Studio (というか Visual C) では標準は符号付きですが, コンパイラオプションで符号なしにもできます.

awa3yee
質問者

お礼

 処理系依存ですか。またいろいろ実験してみます。ありがとうございました。

noname#190876
noname#190876
回答No.3

再び、#1の回答者です。間違い指摘ありがとう>#2 #1の回答の後半は、 □printf("*s1 = %d\n", *s1);  についての解説のことです。

awa3yee
質問者

お礼

 ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

printf("s1 = %d\n", s1); で「s1で、ポイントされる1バイト」はでてきませんぜ>#1. 単に 変数 s1 に入っている値を int と思って出力する だけ. ちなみにポインタ変数の値を %d で出すのは未定義動作だから, 突然 PC で平安京エイリアンが動きだしても文句はいえない (と #1 に乗ってみる).

awa3yee
質問者

お礼

 補足をありがとうございました。

関連するQ&A

専門家に質問してみよう