我在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;
}
}
工作正常。为什么第一种方法在第二种方法没有时失败?我第一次做错了什么,我该如何解决?
答案 0 :(得分:2)
使用指向SomeFunction
结构的指针(双引用)调用outsideADT_T
,而SomeFunction
声明只获取指向该结构的指针(单引用)。试试这个:
outsideADT_T outsidePTR; // <-- notice the lack of '*'
SomeFunction(&outsidePTR);
此外,您在不初始化的情况下取消引用insidePTR1
。你需要在SomeFunction
:
outsidePTR->insidePTR1 = malloc(sizeof(insideADT1_T));
同样适用于insidePTR2
。