出産前後の痔にはご注意!

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

このQ&Aに関連する最新のQ&A

A 回答 (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(この値は処理系によって違う場合がある)となります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/04/03 03:05

>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

となります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/04/03 17:14

0~2番地に入る値は、前者も後者も同じ(すべて'A')です。


ただし、0~2番地の内容を書き換えられるのに対し、
後者は書き換えられません。たぶん、実行時にエラーが出ます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/04/03 03:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング