0

構造体に基づく抽象データ型を 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番目の方法が失敗しないのに、最初の方法が失敗するのはなぜですか? 最初は何が間違っていて、どうすれば修正できますか?

4

1 に答える 1

2

SomeFunction構造体へのポインターへのポインターを使用して呼び出すoutsideADT_T(二重参照) のに対して、SomeFunctionその構造体へのポインターのみを受け取るように宣言します (単一参照)。これを試して:

outsideADT_T outsidePTR; // <-- notice the lack of '*'
SomeFunction(&outsidePTR);

さらに、insidePTR1初期化せずに逆参照します。の先頭にメモリを割り当てる必要がありますSomeFunction

outsidePTR->insidePTR1 = malloc(sizeof(insideADT1_T));

についても同様ですinsidePTR2

于 2013-07-10T13:30:44.403 に答える