0

我在 C 中创建了一个基于结构的抽象数据类型。在这个结构中,有指向其他 ADT 的指针,这些 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;
    }
}

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

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 回答