初めて書き込みする,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;
}
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]は実体だからです。
実体のメンバー参照は「.(ドット演算子)」で行います。
No.2
- 回答日時:
私からの補足です。
struct data{
COORDS *pnt[3];
};
となっていますが、これ、ポインタですよね。
アドレスを格納しないと、メモリ参照エラーがでますよ。
ではでは。
No.3
- 回答日時:
No.1で回答したnaturalです。
失礼しました。(^_^;
読み間違いです。
参照方法はあっていますが、ポインタpntの先に実体がぶら下がっていないことが原因です。
書き込み・読み込むべき領域が存在しないために出ているエラーなので、coords型の変数領域を割り当ててあげる必要があります。
naturalさん,さっそくの返答ありがとうございます.
以下の行を付け加えたら動きました.
COORDS *mem_ptr;
mem_ptr = (COORDS *)malloc(sizeof(COORDS *));
ptr->pnt[0] = mem_ptr;
では.
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;
}
goukun さん,たびたびアドバイスありがとうございます.
うーん,わかりやすくコードですね.
参考にさせて頂きます.
また,何かありましたら、 御指導おねがいいたします.
では.
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;
としないと、コンパイルは通っても、バグが出ると思います。
では、再レスでした。
goukunさん,度重なるアドバイスありがとうございます.
貴君の↓おっしゃるとおりですね.
COORDS *mem_ptr;
mem_ptr = (COORDS *)malloc(sizeof(COORDS *));
ptr->pnt[0] = mem_ptr;
というコードですが、大丈夫ですか?
私には、4バイトのメモリアロックしかされていないように見えますが。。。
Floatを2つだから、8バイト×2で16バイトを取らないといけないのでは。。。
今後とも宜しくです.では.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
VC++6.0 MFC ダイアログバーを...
-
Run-Time Check Failure #3とい...
-
構造体とfscanf
-
基本アルゴリズムの『返す』の...
-
x64プログラムでアドレスが32bi...
-
LPSTR型の初期化について
-
Cで作成したDLL関数をVBから呼...
-
C言語: ポインタ
-
fopne で失敗する原因
-
visual studioのエラーについて
-
popenした子プロセスのプロセス...
-
C++で関数ポインタから関数名を...
-
printfとscanfの違いって・・・
-
ExcelVBAでのkernel32(64bit)
-
PASCALとFARの意味
-
VB.NET DLL【API関数(コールバ...
-
C言語のポインタに直接アドレス...
-
参照型で受け取った引数をポイ...
-
お絵かきソフトにUNDO、REDOを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
戻り値で構造体を返すことは可...
-
fopne で失敗する原因
-
C言語の関数と配列に関する質問
-
Run-Time Check Failure #3とい...
-
LPSTR型の初期化について
-
ExcelVBAでのkernel32(64bit)
-
main(int argc,char **argv[])...
-
アプリを32bitから64bit移行
-
ハンドルはポインタか
-
連結リスト 要素の入れ替え
-
C言語でのconstを返す関数
-
Cで作成したDLL関数をVBから呼...
-
NULLとブランクの違い
-
エラーの意味
-
ハンドル、アドレス、ポインタ...
-
DLL<->VB間での受け渡し(文字...
-
【C言語】戻り値が構造体の関数
おすすめ情報