• ベストアンサー

構造体のメンバ参照について(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

  • C言語の構造体の配列の扱い方

    #include <stdio.h> struct record { char name[10]; float height; float weight; }; /* 各データを、長さ 5 の record 構造体の配列に代入 */ struct record records[5] = { { "yasuo", 170.5, 70.5 }, { "hideaki", 176.5, 65.8 }, { "nobu", 166.5, 58.2 }, { "yuichi", 168.0, 65.4 }, { "nori", 152.7, 68.6 } }; float std_weight(struct record r){ /* 標準体重 = (身長 - 100) * 0.9 */ return (r.height - 100.0) * 0.9; } float std_weight(struct record r); となっている時に、メイン関数にて、5人の身長をもとめる方法と適正標準体重を求める方法を教えてください。構造体の配列を一括で扱うコードがいまいちわかりません。おねがいします。

  • c言語 アロー演算子

    連結リストにおいて *ptr = (*ptr)->link; とはどういう意味ですか? listPointer *ptr; ではなく listPointer ptr;の理由は? ------------------------------------------------------------ typedef struct listNode *listPointer; typedef struct listNode { int data; listPointer link; }; listPointer ptr =NULL; ------------------------------------------------------------

  • C言語のポインタ

    あまり意識せずにポインタを使っているせいか,次のプログラムではまってしまいました. #include<stdio.h> #include<stdlib.h> int main(void) {  int *p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  printf("%d\n", *p);  return 0; } コンパイルエラーで実行ファイルが出力されません. このプログラムで変数qはなぜポインタじゃないのでしょうか? 次にtypedefでptr_intという型を定義したプログラムは, 上のようなエラーが出力されず,期待とおりの結果になりました. #include<stdio.h> #include<stdlib.h> typedef int* ptr_int; int main(void) {  ptr_int p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  *q = 3;  printf("%d\n", *p);  printf("%d\n", *q); return 0; } typedefすることでなぜエラーを回避することができるのでしょうか? よろしくおねがいします.

  • 構造対のメンバについて

    今とあるプログラミングの解析を行っていて、初めて見るプログラミング形式に戸惑っています。 実際には下記のようなものです。 #include <stdio.h> typedef struct test1{ double a; int c; struct test1 *ptr }Test; void main(){ Test *pp; int a; pp->ptr=a; } 本当はもっと長いプログラミングですが、抜粋して書きました。 もし分かりにくかったら補足します。 ここで質問なのですが、最初に定義した構造体の最後の変数(?)は一体どうゆう意味なのでしょうか。 また、main文の中でこのpp->ptrにaを代入してますが、このaはどこに入っていくのでしょうか。 自分でも非常に困惑している状態なので拙い文章になってしまい申し訳ありません。

  • C言語の構造体参照について

    入力ファイルを読み込み、構造体に格納しています。 構造体の中の、char kumiai_kubun[1]が、'0'および'1'になっているかの参照方法を教えてください。 ファイル011100920001000001の部分の最後の数字(1)が組合区分になります。 ・入力ファイル 000000003820050507200504 011100920001000001 エス事業(協)     9999999999999999 ・プログラム #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <errno.h> void print(char* buf, int size); /* 組合情報構造体 */ typedef union kumiaiin_jyouhou { char rawdata[80]; struct hdr { char sikibetu_code[2]; char kensu[8]; char koushin_date[8]; char data_date_year[4]; char data_date_month[2]; char dummy[56]; } header; struct dat { char sikibetu_code[2]; char daicyo_bango[10]; char kumiaiin_bango[5]; char kumiai_kubun[1]; char kaisyamei[46]; char dattai_kaiyaku_ymd[8]; char sakujyo_ymd[8]; } data; } KUMIAIIN_JYOUHOU; int main(int argc, char* argv[]) { KUMIAIIN_JYOUHOU *bufp; FILE *fp; int sts, rtncd; /* 初期化 */ rtncd=0; /* 区切り文字設定 */ strncpy(fs, FS, sizeof(fs)); /* データファイルオープン */ fp = fopen(argv[1], "rb"); /* 組合員情報共用体領域読み込み用メモリの確保 */ bufp = malloc(sizeof(KUMIAIIN_JYOUHOU)); /* ファイル読込 */ while( 1 ) { /* 組合員情報読み込み */ memset(bufp, NULL, sizeof(KUMIAIIN_JYOUHOU)); sts = fread(bufp, sizeof(KUMIAIIN_JYOUHOU), 1, fp); ~組合区分の判定処理~ } fclose(fp); }

  • C言語構造体についてです。

    C言語、π=PI 3.14159265で構造体を用いてmensekiを呼び出して 半径と面積を計算して出力するプログラムです。下の空白を埋めてもらえますか? /* 構造体のプログラム */ #include <stdio.h> #include <math.h> #define PI 3.14159265 struct Data { /* 半径rと面積areaをdoubleで宣言 */ }; void menseki(struct ... 構造体のポインタを引数とする ){ /* 面積を計算する際に構造体のアドレスから計算する */ circle->area=PI* .....; } main(){ struct Data example[2]; //構造体配列 int i; /* 半径rを構造体配列を用いて2例入力する */ /* 2例の各々について mensekiを呼び出して 半径と面積を計算して出力する */ } よろしくお願いします。

  • C言語に関して

    #include <stdio.h> #define NMAX 5 typedef union mixeddata { char status; double data; }MIXD; typedef struct expdata { int flag; MIXD result; ←ここ }EXPD; main() : : : 上のソースの「ここ」と書いてある場所の、result のバイト数はいくつか? と聞かれたのですが、何バイトでしょうか?  回答宜しくお願いします。

  • 構造体のメンバにファイルポインタがあるときの初期化について

    #include<stdio.h> typedef struct file{ FILE *fp; char filename[255]; int flag; }sFILE; main() { sFILE fp={ ,"output.txt",1100}; } のように書きたいんですが、sFILE fp={ ,"output.txt",1100};の最初のファイルポインタのところは何を入れたらいいんでしょうか?

  • 相互に参照する構造体について

    Cプログラミングについての質問です。よろしくお願いします。 以下のヘッダファイル(defx.h, defy.h)および、mainファイルが正しくコンパイルされるということなのですが、自分の環境(WinXP下でのgcc(MinGW))ではエラーが出ます。 エラー内容は error: redefinition of typedef 'SY' error: previous declaration of 'SY' was here error: redefinition of typedef 'SY' error: previous declaration of 'SY' was here です。 <defx.h> #if !defined(__SX) #define __SX typedef struct __sy SY; typedef struct { int a; SY *b; } SX; #endif <defy.h> #if !defined(__SY) #define __SY #include "defx.h" typedef struct __sy { int c; SX d; } SY; #endif mainファイルについては #include "defx.h" #include "defy.h" int main(void) { SX s; SY t; } 以上ですが、 よろしくお願い致します。

  • ヘッダファイルと構造体

    typedef struct{ float x; float y; float z; }Point; typedef struct { struct Point p1; struct Point p2; }Rect; とヘッダファイルに入力しコンパイルしてみると struct Point p1; struct Point p2; のPointが未定義の構造体とエラーが出ます。 どのように書けばいいのでしょう??