- ベストアンサー
C言語での質問です。
いきなりですが、 char str[3] = "AAA"; char *str = "AAA"; 先頭のアドレスを両方とも仮に0番として上記の2つを比べた場合、0番地、1番地、2番地に入る値にそれぞれ違いはあるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「先頭のアドレスを両方とも」という意味が不明です。 あと、上の 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(この値は処理系によって違う場合がある)となります。
その他の回答 (2)
- shinh
- ベストアンサー率39% (363/926)
>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 となります。
お礼
わざわざ試してもいただき、ありがとうございました。 納得できました。
- asuncion
- ベストアンサー率33% (2127/6289)
0~2番地に入る値は、前者も後者も同じ(すべて'A')です。 ただし、0~2番地の内容を書き換えられるのに対し、 後者は書き換えられません。たぶん、実行時にエラーが出ます。
お礼
回答ありがとうございました。
お礼
違いがよくわかり、助かりました。 ありがとうございました。