簡體   English   中英

通過使用free()釋放指針來釋放內存,指針位於指向結構的指針內

[英]Freeing memory by using free() whoes pointer is inside a pointer pointing to structure

嘿! 我知道問題的標題很嚇人,但我仍然無法單行表達問題!

所以我在這里:

有一個數據指針說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    */


     }


}

我該怎么辦??

我知道我已經寫了很多代碼...但是必須寫這么復雜! :(

謝謝您也閱讀本文!!


#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);   
        ....
     }

free((NodePtr->ptr)->DataPtr);   

首先,您的代碼確實很糟糕。 其次,您沒有ptr成員。 您有Ptr成員。 后者是void *,因此,如果要從中刪除DataPtr ,則應使用強制轉換

free(((struct StructTwo*)(NodePtr->Ptr))->DataPtr);   

您需要強制轉換為正確的類型

/* I like parenthesis :-) */
((struct StructTwo *)(NodePtr->ptr))->DataPtr

您需要強制轉換:

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

如果多次使用指針,則聲明一個變量來保存它可以避免在每一行上進行類型轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM