プロが教えるわが家の防犯対策術!

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

}

A 回答 (5件)

>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]は実体だからです。
実体のメンバー参照は「.(ドット演算子)」で行います。
    • good
    • 0

私からの補足です。



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

ではでは。
    • good
    • 0

No.1で回答したnaturalです。


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

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

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

では.

お礼日時:2001/08/23 15:04

再補足で、処理を修正してみました。


(余計なお世話かな?)

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

}
    • good
    • 0
この回答へのお礼

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

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

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

では.

お礼日時:2001/08/23 15:18

あの。

。。
もう一点。

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;
としないと、コンパイルは通っても、バグが出ると思います。

では、再レスでした。
    • good
    • 0
この回答へのお礼

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!