ページ 11

構造体 ポインタ

Posted: 2010年5月23日(日) 18:24
by asdf
C言語で、構造体のメンバ変数がポインタのときについてなのですが、
struct Data {
    char *n;        
         char *m;
};

int main(void) {
    struct Data data[/url] = {
                  {"Suzuki", "Taro"},
        {"Sato"  , "Taro"}
    };
         return 0;
}
のように、なぜ、メンバ変数がポインタなのに文字列を代入してもよいのでしょうか?
前に、ここでポインタについて質問させてもらったときに、

char *str;

ではデータを入れるための領域は確保されていません。

char a100[5];

とかけば5バイトのものが入れられる入れ物が用意されます。
文字列を入れたいなら必要なバイト数先に確保しなくてはなりません。

と教えてもらったので、メンバ変数を今回のようにポインタではなく、配列にしないといけないような気がするのですが、どうなのでしょうか?

よろしくお願いします。

Re:構造体 ポインタ

Posted: 2010年5月23日(日) 18:57
by box
> のように、なぜ、メンバ変数がポインタなのに文字列を代入してもよいのでしょうか?

文字列(リテラル)を代入しているのではなく、
その文字列リテラルの先頭のアドレスを代入しているのです。

char *n;
n = "Suzuki";

という書き方は、普通にありますよね。これと同じです。

Re:構造体 ポインタ

Posted: 2010年5月23日(日) 19:16
by asdf
なるほど。
では、
int main(void) {
    //int a;
    int *b;
    
    //b = &a;
    
    scanf("%d", b);
    printf("%d", *b);
    
    
    return 0;
}
がだめな理由は、bのアドレスが不明なのに、そのアドレスに値を書き込もうとしているからで、コメントの//をとったプログラムが正常に動作するのは、bはaをさしているから、そのaのアドレスに値を書き込もうとしているから・・・という感じでよいのでしょうか?

Re:構造体 ポインタ

Posted: 2010年5月23日(日) 19:47
by box
>bのアドレスが不明なのに、そのアドレスに値を書き込もうとしている

大きな誤解があります。
int *b;
と定義した時点で、変数bのアドレス(変数bがメモリー空間のどこにあるか)は確定しています。
変数bの値(つまり、どこを指しているか)が不定なのです。

Re:構造体 ポインタ

Posted: 2010年5月23日(日) 20:00
by Ma
個人的解釈ですが、質問は、
char *n;
n = "Suzuki";
において、 Suzuki はいったいどこでどうやって確保されているのですか?
ということじゃないでしょうか?

私も正直知りませんw

Re:構造体 ポインタ

Posted: 2010年5月23日(日) 20:13
by box
> char *n;
> n = "Suzuki";
> において、 Suzuki はいったいどこでどうやって確保されているのですか?

"Suzuki"の先頭アドレスがnに入っていますので、
printf("%p\n", n);
とすれば、「あぁ、そこに"Suzuki"という文字列リテラルが確保してあるのね」
ということがわかります。

元の質問者さんは、変数の値とアドレスとがごっちゃになっているのだと思います。
画像

Re:構造体 ポインタ

Posted: 2010年5月23日(日) 21:54
by asdf
はい、boxさんの言うとおりだと思います。
もっと、ポインタについて勉強してみます。
ありがとうございました。