入れ子になった構造体について質問です。

下記プログラムを組みました。
コンパイルは通りますが、実行できません。
ポインタでつまずいていると思うのですが、ダメな理由が分かりません。
恐れ入りますが、宜しくお願いします。

#include <stdio.h>

void main(void)
{
struct name{
char *sei;
char *mei;
};

struct table {
struct name *n;
int age;
char *hobby;
};

struct table x,y;

x.n->sei = "Turing";
printf("sei = %s\n",x.n->sei);
}

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2012/06/17 17:05:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:yossiy7 No.1

回答回数778ベストアンサー獲得回数96

ポイント34pt

y使ってないのはどうでもいいです
nの実体が無いです
まず
struct name n;
x->n = &n;
こんな感じでnの実体を作らないと。
試しに、今x->nには何が入ってますか?

他6件のコメントを見る
id:mizore_chan

有難う御座います。

やってみましたが、
x.n+1->sei = "Turing1";
x.n+2->sei = "Turing2";
x.n+3->sei = "Turing3";
の部分で、コンパイルエラーがでます。
    >>>> -> か ->* の左には構造体のポインタが必要(関数 main )
n+1 という表現は正しいでしょうか?
宜しくお願いします。

2012/06/11 22:12:57
id:yossiy7

今更ですが(一度回答したんですが消えてた?)
x.n[1]->sei="Turing1"
とか出来ます

2012/06/17 22:33:26

その他の回答2件)

id:yossiy7 No.1

回答回数778ベストアンサー獲得回数96ここでベストアンサー

ポイント34pt

y使ってないのはどうでもいいです
nの実体が無いです
まず
struct name n;
x->n = &n;
こんな感じでnの実体を作らないと。
試しに、今x->nには何が入ってますか?

他6件のコメントを見る
id:mizore_chan

有難う御座います。

やってみましたが、
x.n+1->sei = "Turing1";
x.n+2->sei = "Turing2";
x.n+3->sei = "Turing3";
の部分で、コンパイルエラーがでます。
    >>>> -> か ->* の左には構造体のポインタが必要(関数 main )
n+1 という表現は正しいでしょうか?
宜しくお願いします。

2012/06/11 22:12:57
id:yossiy7

今更ですが(一度回答したんですが消えてた?)
x.n[1]->sei="Turing1"
とか出来ます

2012/06/17 22:33:26
id:a-kuma3 No.2

回答回数4974ベストアンサー獲得回数2154

ポイント33pt

table に、必ず name がついてまわるなら、こうした方が良いと思うな。

struct name{
    char *sei;
    char *mei;
};

struct table {
    struct name n;      /* ポインタじゃなくする */
    int age;
    char *hobby;
};

struct table x;

x.n.sei = "Turing";     /* n はポインタじゃないので、-> じゃなくて、ピリオド */
printf("sei = %s\n",x.n.sei);    /* こっちも */


【追記】

構造体での入れ子とポインタの使い方を理解したいので、
ポインタで無くするというのはナシでお願いします。

ラジャー。

二つの構造体が、正しく組み合わさって動くためには、以下のような関係になっている必要があります。
f:id:a-kuma3:20120610175049j:image

質問にあるソースだと、name 構造体の実体が作られていないこと、table 構造体の n メンバーが name の実体に相当する領域を指していないこと、が、正しく動かない理由です。

例えば、こんな感じ。

struct name{
    char *sei;
    char *mei;
};

struct table {
    struct name *n;
    int age;
    char *hobby;
};

struct table x;
x.n = (struct name *)alloca(sizeof(struct name));		/* ★ */
x.hobby = "My hobby !";

x.n->sei = "Turing";
x.n->mei = "...";
printf("sei = %s\n",x.n->sei);
他1件のコメントを見る
id:a-kuma3

回答に追記しました。

2012/06/10 18:00:36
id:mizore_chan

有難う御座います。
構造体tableのメンバーに構造体nameのポインタを用いるのは
使い辛いことが分かりました。

有りがとう御座います。 

2012/06/10 18:30:01
id:oil999 No.3

回答回数1728ベストアンサー獲得回数320

ポイント33pt

下のように、構造体ポインタの実体(実アドレス)を代入してやる必要があります。

#include <stdio.h>

void main(void)
{
    struct name {
    char *sei;
    char *mei;
} name_r;

struct table {
    struct name *n;
    int age;
    char *hobby;
};

struct table x,y;

x.n = &name_r;           /* ポインタの実体を代入 */
x.n->sei = "Turing";
printf("sei = %s\n",x.n->sei);
}
id:mizore_chan

有難う御座います。

実体が必要なんですね。

2012/06/10 19:11:44

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません