• ベストアンサー

構造体のメンバ参照について(C言語)

初めて書き込みする,taroimotenです. 以下のプログラムを作ってみたのですが, メモリ参照エラーが表示され,うまく動きません. アドバイスおねがいします! #include <stdio.h> #include <stdlib.h> // 型宣言. typedef struct data DATA; typedef struct coords COORDS; // 構造体の定義. struct data{ COORDS *pnt[3]; }; struct coords{ float r1; float r2; }; int main(void) { DATA *ptr; DATA x; // ポインタ変数の初期化. ptr = &x; // メンバへの値の代入. ptr->pnt[0]->r1 = 100.0; printf(" r1 : %f \n",ptr->pnt[0]->r1); return EXIT_SUCCESS; }

質問者が選んだベストアンサー

  • ベストアンサー
  • goukun
  • ベストアンサー率45% (49/108)
回答No.5

あの。。。 もう一点。 COORDS *mem_ptr; mem_ptr = (COORDS *)malloc(sizeof(COORDS *)); ptr->pnt[0] = mem_ptr; というコードですが、大丈夫ですか? 私には、4バイトのメモリアロックしかされていないように見えますが。。。 Floatを2つだから、8バイト×2で16バイトを取らないといけないのでは。。。 このコードは、 COORDS *mem_ptr; mem_ptr = (COORDS *)malloc(sizeof(COORDS)); ptr->pnt[0] = mem_ptr; としないと、コンパイルは通っても、バグが出ると思います。 では、再レスでした。

taroimoten
質問者

お礼

goukunさん,度重なるアドバイスありがとうございます. 貴君の↓おっしゃるとおりですね. COORDS *mem_ptr; mem_ptr = (COORDS *)malloc(sizeof(COORDS *)); ptr->pnt[0] = mem_ptr; というコードですが、大丈夫ですか? 私には、4バイトのメモリアロックしかされていないように見えますが。。。 Floatを2つだから、8バイト×2で16バイトを取らないといけないのでは。。。 今後とも宜しくです.では.

その他の回答 (4)

  • goukun
  • ベストアンサー率45% (49/108)
回答No.4

再補足で、処理を修正してみました。 (余計なお世話かな?) きっと、こうならないと、コンパイルでエラーが出ると思います。 No.1の方のお答えに合わせて修正して見たソースです。 ではでは。 ----<ソース>-------- #include <stdio.h> #include <stdlib.h> // 型宣言. // typedef struct data DATA; // typedef struct coords COORDS; // 構造体の定義. typedef struct coords{ float r1; float r2; }COORDS; typedef struct data{ // COORDS *pnt[3]; COORDS pnt[3]; }DATA; int main(void) { DATA *ptr; DATA x; // ポインタ変数の初期化. ptr = &x; // メンバへの値の代入. ptr->pnt[0].r1 = 100.0; printf(" r1 : %f \n",ptr->pnt[0].r1); return EXIT_SUCCESS; }

taroimoten
質問者

お礼

goukun さん,たびたびアドバイスありがとうございます. うーん,わかりやすくコードですね. 参考にさせて頂きます. また,何かありましたら、 御指導おねがいいたします. では.

  • natural
  • ベストアンサー率37% (419/1115)
回答No.3

No.1で回答したnaturalです。 失礼しました。(^_^; 読み間違いです。 参照方法はあっていますが、ポインタpntの先に実体がぶら下がっていないことが原因です。 書き込み・読み込むべき領域が存在しないために出ているエラーなので、coords型の変数領域を割り当ててあげる必要があります。

taroimoten
質問者

お礼

naturalさん,さっそくの返答ありがとうございます. 以下の行を付け加えたら動きました. COORDS *mem_ptr; mem_ptr = (COORDS *)malloc(sizeof(COORDS *)); ptr->pnt[0] = mem_ptr; では.

  • goukun
  • ベストアンサー率45% (49/108)
回答No.2

私からの補足です。 struct data{ COORDS *pnt[3]; }; となっていますが、これ、ポインタですよね。 アドレスを格納しないと、メモリ参照エラーがでますよ。 ではでは。

  • natural
  • ベストアンサー率37% (419/1115)
回答No.1

>ptr->pnt[0]->r1 = 100.0; ptr->pnt[0].r1 = 100.0; です。 >printf(" r1 : %f \n",ptr->pnt[0]->r1); 同じく printf(" r1 : %f \n",ptr->pnt[0].r1); です。 ポインタptrで参照した先のpnt[0]は実体だからです。 実体のメンバー参照は「.(ドット演算子)」で行います。

関連するQ&A