• ベストアンサー

C言語での質問です。

いきなりですが、 char str[3] = "AAA"; char *str = "AAA"; 先頭のアドレスを両方とも仮に0番として上記の2つを比べた場合、0番地、1番地、2番地に入る値にそれぞれ違いはあるのでしょうか?

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

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

「先頭のアドレスを両方とも」という意味が不明です。 あと、上の char str[3]; は配列のサイズが危険です。 char str[3] = "AAA"; は、str[3]という配列を"AAA"で初期化しているので、str[3]の中に各々'A'の値が入ります。 char *str = "AAA"; の方は"AAA"という文字列リテラルのポインタを、strに代入しているだけです。 「str」が0番地、"AAA"が100番地にあったとすると、 0番地の値は上が'A'ですが、下は100(この値は処理系によって違う場合がある)となります。

teso5631
質問者

お礼

違いがよくわかり、助かりました。 ありがとうございました。

その他の回答 (2)

  • shinh
  • ベストアンサー率39% (363/926)
回答No.3

>char str[3] = "AAA"; は 間違いですね コンパイルしたら エラーがでました。 仮に (1)char str[3] = {'A','A','A'}; (2)char *str = "AAA"; として (1)は 1バイトの領域を3個 とってます。 0番地 [] 1番地 [] 2番地 [] (2)は、(32ビット処理系として) char型のポインターを入れる領域をとっているので 4バイト 取ってます。 (この変数に入る(入れる)のは 32ビットのchar型のポインター です。) 0番地 [] 1番地 [] 2番地 [] 3番地 [] (1)の場合は 0番地  'A' 1番地  'A' 2番地  'A' (2)の場合は (リトルエンディアンとして) 仮に ”AAA"を割り付けた番地を0x01020304とすると 0x01020304番地  'A'       5番地  'A'       62番地  'A' str 0番地   0x04    1番地   0x03    2番地   0x02    3番地   0x01 となります。

teso5631
質問者

お礼

わざわざ試してもいただき、ありがとうございました。 納得できました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

0~2番地に入る値は、前者も後者も同じ(すべて'A')です。 ただし、0~2番地の内容を書き換えられるのに対し、 後者は書き換えられません。たぶん、実行時にエラーが出ます。

teso5631
質問者

お礼

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

関連するQ&A