通过使用free()whoes指针释放内存位于指向结构的指针内

时间:2010-11-18 13:26:14

标签: c pointers

喂! 我知道问题的标题非常可怕,但我仍然无法用单行表达问题!

所以我走了:

有一个数据指针说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    */


     }


}

我该怎么办?

我知道我编写的代码非常糟糕......但是要编写这么复杂的代码! :(

感谢您阅读此内容!!

4 个答案:

答案 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);
  }

如果多次使用指针,声明一个变量来保存它就可以避免在每一行上进行类型转换。