2010-11-18 11 views
1

Hey! Ich weiß, Titel der Frage ist sehr unheimlich, aber ich bin immer noch nicht in der Lage, das Problem in einer Zeile auszudrücken!Freigeben von Speicher mithilfe von free() whoes Zeiger ist in einem Zeiger, der auf Struktur

So Here I go:

Es gibt einen Datenzeiger DataPtr sagen, die zu einem dynamisch zugewiesenen Speicher zeigen, und eine andere Struktur Pointer StructPtr sagen, welche auch eine dynamisch zugewiesenen Struktur zeigt.

Und diese beiden sind in einer anderen Struktur, sagen OuterStructure.

Es gibt eine verknüpfte Liste, die Zeiger auf OuterStructure enthält.

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 */ 

Der Kodex für DeleteNode ist wie folgt:

Was soll ich tun ??

Ich weiß, dass ich Code schrecklich geschrieben habe ... aber muss das viel komplex schreiben !! :(

Danke dies auch für das Lesen !!

Antwort

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

+0

Dies ist auch ein guter Weg! Danke Rosh! – Swanand

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

vor allem, es ist wahr, dass Ihr Code ist schrecklich. Zweitens Sie ein ptr Mitglied nicht haben. Sie haben eine Ptr Mitglied. Und letzteres ist void *, wenn Sie also DataPtr aus ihm heraus bekommen möchten, können Sie ein gegossenes

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

Vielen Dank !! Und es tut mir leid, dass Sie so einen gefährlichen Code gelesen haben! :( – Swanand

+0

und "ptr" Problem war nur ein Tippfehler auf StackOverflow nicht in Original-Code !! – Swanand

1

Sie auf den richtigen Typ

verwenden solltenmüssen gegossen
/* I like parenthesis :-) */ 
((struct StructTwo *)(NodePtr->ptr))->DataPtr 
0

Sie müssen werfen:

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

Wenn Sie den Mauszeiger mehr als einmal verwenden, die Deklaration einer Variablen zu halten es in jeder Zeile die Art Casting zu tun vermeidet.

Verwandte Themen