構造体に基づく抽象データ型を C で作成しました。この構造内には、構造に基づく他の ADT へのポインタがあります。内部のポインターを適切に初期化し、メモリアクセス違反エラーを取り除く方法/かどうかを知りたいです。コードは以下のとおりです。
typedef struct insideADT1_S{
int someConstant1;
int someArrray1[500];
} insideADT1_T
typedef struct insideADT2_S{
int someConstant2;
int someArray2[500];
} insideADT2_T
typedef struct outsideADT_S{
insideADT1_T *insidePTR1;
insideADT2_T *insidePTR2;
} outsideADT_T
外部構造を作成し、関数に渡します。関数内で、内部メンバーの 1 つを取得しようとすると、クラッシュしてメモリ アクセス エラーが発生します。以下に例を示します。
outsideADT_T *outsidePTR;
SomeFunction(&outsidePTR);
SomeFunction の内部は次のようになります。
void SomeFunction(outsideADT_T *outsidePTR){
//===Fill Array of Inside ADT===//
for (i=0; i<500; i++){
outsidePTR->insidePTR1->someArray1[i] = i; //OOPS! Memory Access Violation! FAIL!
}
}
ただし、このようにアクセスすると、メモリ アクセス違反が発生します。ADT の代わりに構造体バージョンを使用し、それらの構造体へのポインターを定義しないことで問題を解決できることに注意してください。例えば:
typedef struct outsideADT_S{
struct insideADT1_S insideSTC1;
struct insideADT2_S insideSTC2;
} outsideADT_T
void SomeFunction(outsideADT_T *outsidePTR){
//===Fill Array of Inside ADT===//
for (i=0; i<500; i++){
outsidePTR->insideSTC1.someArray1[i] = i;
}
}
正常に動作します。2番目の方法が失敗しないのに、最初の方法が失敗するのはなぜですか? 最初は何が間違っていて、どうすれば修正できますか?