新しく質問する

C言語での質問です。

役に立った:1件
  • 質問者:teso5631
  • 投稿日時:2010/04/03 01:38
  • 困り度:暇なときに回答をください

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

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:1件)
  • 参考になった:0件
  • 回答者:shinh
  • 回答日時:2010/04/03 02:24

>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

となります。

通報する

この回答へのお礼

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

  • 参考になった:0件

No.2ベストアンサー10pt

  • 回答者:asuncion
  • 回答日時:2010/04/03 02:21

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

通報する

この回答へのお礼

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

  • 参考になった:0件

No.1ベストアンサー20pt

  • 回答者:magicalpass
  • 回答日時:2010/04/03 02:11

「先頭のアドレスを両方とも」という意味が不明です。
あと、上の 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(この値は処理系によって違う場合がある)となります。

通報する

この回答へのお礼

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

  
このQ&Aは役に立ちましたか?(役に立った:1件)

このページのトップへ