OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 困ってます
  • 質問No.123066
  • 閲覧数130
  • ありがとう数7
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 47% (9/19)

初めて書き込みする,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;

}
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.5
レベル9

ベストアンサー率 45% (49/108)

あの。。。
もう一点。

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

お礼率 47% (9/19)

goukunさん,度重なるアドバイスありがとうございます.
貴君の↓おっしゃるとおりですね.

COORDS *mem_ptr;
mem_ptr = (COORDS *)malloc(sizeof(COORDS *));
ptr->pnt[0] = mem_ptr;

というコードですが、大丈夫ですか?
私には、4バイトのメモリアロックしかされていないように見えますが。。。
Floatを2つだから、8バイト×2で16バイトを取らないといけないのでは。。。

今後とも宜しくです.では.
投稿日時 - 2001-08-23 16:56:38
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル13

ベストアンサー率 37% (419/1115)

>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 ...続きを読む
>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]は実体だからです。
実体のメンバー参照は「.(ドット演算子)」で行います。
  • 回答No.2
レベル9

ベストアンサー率 45% (49/108)

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

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

ではでは。
  • 回答No.3
レベル13

ベストアンサー率 37% (419/1115)

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

お礼率 47% (9/19)

naturalさん,さっそくの返答ありがとうございます.
以下の行を付け加えたら動きました.

COORDS *mem_ptr;
mem_ptr = (COORDS *)malloc(sizeof(COORDS *));
ptr->pnt[0] = mem_ptr;

では.
投稿日時 - 2001-08-23 15:04:04
  • 回答No.4
レベル9

ベストアンサー率 45% (49/108)

再補足で、処理を修正してみました。 (余計なお世話かな?) きっと、こうならないと、コンパイルでエラーが出ると思います。 No.1の方のお答えに合わせて修正して見たソースです。 ではでは。 ----<ソース>-------- #include <stdio.h> #include <stdlib.h> // 型宣言. // typ ...続きを読む
再補足で、処理を修正してみました。
(余計なお世話かな?)

きっと、こうならないと、コンパイルでエラーが出ると思います。
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

お礼率 47% (9/19)

goukun さん,たびたびアドバイスありがとうございます.

うーん,わかりやすくコードですね.
参考にさせて頂きます.

また,何かありましたら、 御指導おねがいいたします.

では.
投稿日時 - 2001-08-23 15:18:41
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ