喂! 我知道问题的标题非常可怕,但我仍然无法用单行表达问题!
所以我走了:
有一个数据指针说DataPtr指向动态分配的内存,另一个结构指针说StructPtr也指向动态分配的结构。
而这些都属于另一种结构,比如OuterStructure。
有一个链接列表,其中包含指向OuterStructure的指针。
struct StructONE
{
int a;
char b;
float c;
};
struct InnerStruct
{
char a;
int b;
};
struct StructTWO
{
int Num;
char * DataPtr;
struct InnerStruct * StructPtr;
};
struct LinkList
{
int NodeNum;
int NodeType; /* To Indicate Whether Pointer is of StructOne or StructTwo */
void * Ptr; /* This can be of type StructONE or StructTWO */
struct LinkList * Next;
};
LinkList * Start;
void main()
{
/* Structure Declarations */
InnerStruct * InnerStructure;
StructONE * OneStruct;
StructTWO * TwoStruct;
/* Fill up all the Structure */
InnerStructure= (InnerStruct *)calloc(100,sizeof(InnerStruct));
InnerStructure->a='a';
InnerStructure->b=5;
OneStruct= (StructONE *)calloc(100,sizeof(StructONE));
TwoStruct= (StructTWO *)calloc(100,sizeof(StructTWO));
TwoStruct->Dataptr=(char *) calloc(10,sizeof(char));
TwoStruct->StructPtr= InnerStructure;
/* Add these to Linked List
void Add_to_Linked_List(int NodeNum,int NodeType,void *ptr)
*/
Add_to_Linked_List(1,1,OneStruct);
Add_to_Linked_List(2,2,TwoStruct);
/* Everything is Okey Till Here.
Now When I want to delete a node from linked list,
First I have to release Memory pointed by DataPtr and StructPtr. */
DeleteNode(1);
} /* End of Main */
DeleteNode代码如下:
void DeleteNode(int Num)
{
LinkList * NodePtr,*TempNode;
NodePtr= Start;
while(NodePtr->NodeNum!=Num)
NodePtr=NodePtr->Next;
/* Now NodePtr points to desired node */
if(NodePtr->NodeType==1) /* Pointer is StructONE Type */
{
free(NodePtr->Ptr);
TempNode->Next=NodePtr->Next;
free(NodePtr);
return;
}
else
{
/* Now the Problem Begins....
In StructTWO type, I have to release Memory allocated for DataPtr as well Struct Ptr */
free((NodePtr->ptr)->DataPtr);
/* This Line Generates Error as
Error C2227: left of '->DataPtr' must point to class/struct/union/generic type */
}
}
我该怎么办?
我知道我编写的代码非常糟糕......但是要编写这么复杂的代码! :(
感谢您阅读此内容!!
答案 0 :(得分:4)
#define STRUCT_ONE 1
#define STRUCT_TWO 2
struct LinkList
{
int NodeNum;
int NodeType;
union
{
StructONE * Ptr_One;
StructTWO * Ptr_Two;
};
};
................
if(NodePtr->NodeType==STRUCT_ONE)
{
free(NodePtr->Ptr_One);
TempNode->Next=NodePtr->Next;
free(NodePtr);
return;
}
else
{
free(NodePtr->Ptr_Two->DataPtr);
....
}
答案 1 :(得分:3)
free((NodePtr->ptr)->DataPtr);
首先,您的代码确实很糟糕。其次,您没有ptr
成员。您有Ptr
个成员。而后者是无效*,所以如果你想从中获取DataPtr
,你应该使用演员
free(((struct StructTwo*)(NodePtr->Ptr))->DataPtr);
答案 2 :(得分:1)
您需要转换为正确的类型
/* I like parenthesis :-) */
((struct StructTwo *)(NodePtr->ptr))->DataPtr
答案 3 :(得分:0)
你需要施放:
if(NodePtr->NodeType==1) /* Pointer is StructONE Type */
{
....
}
else
{
struct StructTwo * s2ptr;
s2ptr = (struct StructTwo *)NodePtr->ptr;
free(s2ptr->DataPtr);
free(s2ptr->StructPtr);
free(NodePtr);
}
如果多次使用指针,声明一个变量来保存它就可以避免在每一行上进行类型转换。