構造体 ポインタ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
asdf

構造体 ポインタ

#1

投稿記事 by asdf » 15年前

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バイトのものが入れられる入れ物が用意されます。
文字列を入れたいなら必要なバイト数先に確保しなくてはなりません。

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

よろしくお願いします。

box

Re:構造体 ポインタ

#2

投稿記事 by box » 15年前

> のように、なぜ、メンバ変数がポインタなのに文字列を代入してもよいのでしょうか?

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

char *n;
n = "Suzuki";

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

asdf

Re:構造体 ポインタ

#3

投稿記事 by asdf » 15年前

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

box

Re:構造体 ポインタ

#4

投稿記事 by box » 15年前

>bのアドレスが不明なのに、そのアドレスに値を書き込もうとしている

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

Ma

Re:構造体 ポインタ

#5

投稿記事 by Ma » 15年前

個人的解釈ですが、質問は、
char *n;
n = "Suzuki";
において、 Suzuki はいったいどこでどうやって確保されているのですか?
ということじゃないでしょうか?

私も正直知りませんw

box

Re:構造体 ポインタ

#6

投稿記事 by box » 15年前

> char *n;
> n = "Suzuki";
> において、 Suzuki はいったいどこでどうやって確保されているのですか?

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

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

asdf

Re:構造体 ポインタ

#7

投稿記事 by asdf » 15年前

はい、boxさんの言うとおりだと思います。
もっと、ポインタについて勉強してみます。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る