指向C中另一个ADT内的用户定义的ADT

时间:2013-07-10 13:22:29

标签: c pointers struct structure

我在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

我创建外部结构并将其传递给函数。在函数内部,我尝试获取其中一个内部成员,然后崩溃并获得内存访问错误。一个例子如下:

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

工作正常。为什么第一种方法在第二种方法没有时失败?我第一次做错了什么,我该如何解决?

1 个答案:

答案 0 :(得分:2)

使用指向SomeFunction结构的指针(双引用)调用outsideADT_T,而SomeFunction声明只获取指向该结构的指针(单引用)。试试这个:

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

此外,您在不初始化的情况下取消引用insidePTR1。你需要在SomeFunction

的开头为它分配一些内存
outsidePTR->insidePTR1 = malloc(sizeof(insideADT1_T));

同样适用于insidePTR2