Apontando para os 'ADTs' definidos pelo Utilizador dentro de outro ' ADT ' em C

criei um tipo de dados abstractos em C que é baseado numa estrutura. Dentro desta estrutura, há ponteiros para outros ADTs que também são baseados fora de estruturas. Eu quero saber como / se eu posso inicializar corretamente os ponteiros no interior e se livrar de meus erros de violação de acesso à memória. O código é o seguinte:

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
Eu crio a estrutura externa e passo-a para uma função. Dentro da função, eu tento obter um dos membros internos, e eu cai e obter um erro de acesso à memória. Um exemplo está abaixo:

outsideADT_T *outsidePTR;
SomeFunction(&outsidePTR);
O interior de alguma função parece:
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!
    }
}
No entanto, aceder assim dá-me violações de acesso à memória. Note que eu posso resolver o problema usando as versões da estrutura, em vez dos ADTs, e não definindo ponteiros para essas estruturas. Por exemplo:

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;
    }
}

funciona bem. Porque é que o primeiro método falha quando o segundo não falha? O que estou a fazer mal da primeira vez, e como posso corrigi-lo?

Author: The Dude, 2013-07-10

1 answers

Você chama SomeFunction com um ponteiro para um ponteiro para uma estrutura outsideADT_T (Referência dupla), enquanto SomeFunction é declarar apenas tomar um ponteiro para essa estrutura (referência única). Tenta isto.

outsideADT_T outsidePTR; // <-- notice the lack of '*'
SomeFunction(&outsidePTR);
Além disso, dereferência sem inicializá-la. Você vai precisar de alocar alguma memória para ele no início de SomeFunction:
outsidePTR->insidePTR1 = malloc(sizeof(insideADT1_T));

O mesmo vale para insidePTR2.

 2
Author: Drew McGowen, 2013-07-10 13:30:44