![](/img/trans.png)
[英]Will freeing a structure pointer also free the memory allocated inside of the structure in C?
[英]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.