2010-11-18 79 views
1

嘿! 我知道问题的标题是非常可怕的,但我仍然无法用单行表达问题!通过使用free()whoes指针在指向结构的指针内释放内存

所以在这里,我去:

有一个数据指针说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是这样的:

我该怎么办?

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

感谢您阅读这个问题,以及!

回答

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

这也是一个很棒的方式!!谢谢Rosh! – Swanand 2010-11-19 04:16:08

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

首先,这是事实,你的代码是可怕的。第二,你没有ptr成员。你有Ptr成员。而后者是void *的,所以如果你想获得DataPtr出来的,你应该使用一个投

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

非常感谢!我很抱歉让你阅读这样一个危险的代码! :( – Swanand 2010-11-18 13:37:59

+0

和“ptr”问题只是StackOverflow上的拼写错误而不是原始代码!! – Swanand 2010-11-18 13:38:31

1

你需要转换为正确的类型

/* I like parenthesis :-) */ 
((struct StructTwo *)(NodePtr->ptr))->DataPtr 
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); 
    } 

如果您使用指针超过一次,声明一个变量来保存它避免做每行的类型转换。