首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于树的内存释放有关问题,方法都试过了,老是死掉,哪位高手来帮小弟我看看

2013-07-09 
关于树的内存释放问题,方法都试过了,老是死掉,谁来帮我看看啊我就不bb了,直接代码,就是后面的节点释放有问

关于树的内存释放问题,方法都试过了,老是死掉,谁来帮我看看啊
我就不bb了,直接代码,就是后面的节点释放有问题,本来是语法分析的节点树,我简化成一棵小树了,所有的次序都试过了,先儿子(左右节点交换)后指针(指针顺序、逆序),先指针后儿子(左右节点交换)都不行,实在没办法了,老是在第二个free出错,谁帮我看看

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node
{
char* id;
char* name;
char* value;
struct Node* lchild;
struct Node* rchild;
}Node;

Node* Init();
Node* CreateNode();
void Free(Node* root);

int main()
{
Node* root;
root = Init();

root->lchild = CreateNode();
root->lchild->id = (char*)malloc(sizeof(strlen("lid"))+1);
strcpy(root->lchild->id, "lid");
root->lchild->name = (char*)malloc(sizeof(strlen("lname"))+1);
strcpy(root->lchild->name, "lname");
root->lchild->value = (char*)malloc(sizeof(strlen("lvalue"))+1);
strcpy(root->lchild->value, "lvalue");
root->lchild->lchild = NULL;
root->lchild->rchild = NULL;


/*
//节点只有一部分指针分配内存
root->lchild = CreateNode();
root->lchild->id = (char*)malloc(sizeof(strlen("lid"))+1);
root->lchild->name = NULL; //(char*)malloc(sizeof(strlen("lname"))+1);
root->lchild->value = (char*)malloc(sizeof(strlen("lvalue"))+1);
root->lchild->lchild = NULL;
root->lchild->rchild = NULL;
*/

//按照释放顺序来分配右儿子节点内容
root->rchild = CreateNode();
root->rchild->id = (char*)malloc(sizeof(strlen("rid"))+1);
strcpy(root->rchild->id, "rid");
root->rchild->name = (char*)malloc(sizeof(strlen("rname"))+1);
strcpy(root->rchild->name, "rname");
root->rchild->value = (char*)malloc(sizeof(strlen("rvalue"))+1);
strcpy(root->rchild->value, "rvalue");
root->rchild->lchild = NULL;
root->rchild->rchild = NULL;

/*
//不按照释放的顺序来分配右儿子节点内存:
root->rchild = CreateNode();
root->rchild->name = (char*)malloc(sizeof(strlen("rname"))+1);
root->rchild->value = (char*)malloc(sizeof(strlen("rvalue"))+1);
root->rchild->id = (char*)malloc(sizeof(strlen("rid"))+1);
root->rchild->lchild = NULL;
root->rchild->rchild = NULL;
*/
Free(root);

return 0;
}

Node* CreateNode()
{
Node* temp = (Node*)malloc(sizeof(Node));
temp->id = NULL;
temp->name = NULL;


temp->value = NULL;
temp->lchild = NULL;
temp->rchild = NULL;
return temp;
}

Node* Init()
{
Node* temp = (Node*)malloc(sizeof(Node));

temp->id = (char*)malloc(sizeof(strlen("rootid"))+1);
strcpy(temp->id, "rootid");
temp->name = (char*)malloc(sizeof(strlen("rootname"))+1);
strcpy(temp->name, "rootname");
temp->value = (char*)malloc(sizeof(strlen("rootvalue"))+1);
strcpy(temp->value, "rootvalue");

temp->lchild = NULL;
temp->rchild = NULL;
return temp;
}

void Free(Node* root)
{
Node* temp;
temp = root;

if (temp != NULL)
{
Free(temp->rchild);
Free(temp->lchild);


if (temp->id != NULL)
{
printf("%s:%d:\n", temp->id, strlen(temp->id));
free(temp->id);
temp->id = NULL;
}
if (temp->name != NULL)
{
printf("%s:%d:\n", temp->name, strlen(temp->name));
free(temp->name);
temp->name = NULL;
}
if (temp->value != NULL)
{
printf("%s:%d:\n", temp->value, strlen(temp->value));
free(temp->value);
temp->value = NULL;
}

free(temp);
temp = NULL;
}
}

free;C语言;内存释放;
[解决办法]
所有的sizeof(strlen(……))

改为strlen(……)

内存块长度不够,写越界了。
[解决办法]
楼上正解。sizeof(strlen(……))=4,

热点排行