| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 711 人关注过本帖
标题:[求助]关于free()函数
只看楼主 加入收藏
fantasyop
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2005-2-25
收藏
 问题点数:0 回复次数:9 
[求助]关于free()函数

#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct LNode)

int num=20;

struct LNode
{
int num;
struct LNode* next;
};

struct LNode* talloc(void)
{
return (struct LNode*)malloc(LEN);
}

void dateget(struct LNode *_root)
{
_root->num = num++;
_root->next = NULL;
}

struct LNode *addroot(struct LNode *_root)
{
struct LNode *p = NULL, *p2 = NULL;

if(_root == NULL)
{
_root = talloc();
dateget(_root);
}
else
{
for(p=_root; p->next != NULL; p=p->next)
;
p2 = talloc();
dateget(p2);
p->next = p2;
}

return _root;
}

struct LNode *kill(struct LNode *_root, int num)
{
struct LNode *p=_root, *p2=NULL;

if(p->num == num)
{
_root = _root->next;
free(p);
}
else
{
for(;p->next->num != num && p->next != NULL; p=p->next)
;
if(p->next->num == num)
{
p2 = p->next;
p->next = p->next->next;
free(p2);
}
}

return _root;
}

main()
{
struct LNode *_root = NULL;
char i;

for(i=0; i < 10; i++)
{
_root = addroot(_root);
}

//for(i=20; i < 30; i++)
{

/*_root = */kill(_root,20); //我杀死头结点
}

for(; _root != NULL && _root->next != NULL ; _root=_root->next)
{
printf("_root=%x next=%x num=%d\n",_root, _root->next, _root->num);
}
printf("_root=%x next=%x num=%d\n",_root, _root->next, _root->num);
}

_root=273768 next=273788 num=0 //我让主函数_root仍然指向刚才释放的头结点
_root=273788 next=273798 num=21
_root=273798 next=2737a8 num=22
_root=2737a8 next=2737b8 num=23
_root=2737b8 next=2737c8 num=24
_root=2737c8 next=2737d8 num=25
_root=2737d8 next=2737e8 num=26
_root=2737e8 next=2737f8 num=27
_root=2737f8 next=273808 num=28
_root=273808 next=0 num=29
Press any key to continue...


刚回家,把这个链表kill函数写好了,我想问的是 free怎么释放结构体指针的
struct LNode
{
char* date;
int size;
int num;
struct LNode* next;
}*root; //结构体“指针变量”刚才没把这个指针打进去......

root = (struct LNode*)malloc(LEN);
root->date = (char *)malloc(20);
root->size = 100;
root->num=200;
free(root);
这样编译器给我释放的是怎么样的空间

[此贴子已经被作者于2006-5-16 17:34:32编辑过]

搜索更多相关主题的帖子: free 函数 
2006-05-16 04:15
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
朋友,链表空间的free()本来就有点难。为什么呢?因为它不像数组那样,不是一片连续的内存。释放的思路是:既然当初是一个结点一个结点申请来的空间,那么我们还得一个结点一个结点地予以释放。free()的顺序建议从首结点到尾结点。注意事项:释放前一定要把next(下一个结点的地址)保存在某指针变量中,否则就free()不下去了。

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-16 06:50
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
收藏
得分:0 

象打印链表一样释放空间,先保存释放结点,让结点指向下一个结点,释放保存结点


日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-16 16:30
fantasyop
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2005-2-25
收藏
得分:0 
我想问的不是链表的操作,而是free()怎么释放结构体指针变量
struct LNode
{
char* date;
int size;
int num;
struct LNode* next;
}*root;
如果我这样定义一个结构体变量 再给date申请20个空间
free(root);
这样编译器给我释放的是怎么样的空间

[此贴子已经被作者于2006-5-16 17:10:05编辑过]


今年俺是大菜鸟,明年俺希望是小菜鸟,......
2006-05-16 17:04
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
回复:(fantasyop)我想问的不是链表+的操作,而是fre...
朋友,在您说的情况下,就不能不必free()了。

说“不能”,是因为指针变量root是静态分配来的,不是来自malloc()

说“不必”,是因为指针变量root开销的内存极其有限(2~4 bytes)

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-16 17:18
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
以下是引用fantasyop在2006-5-16 17:04:00的发言:
我想问的不是链表的操作,而是free()怎么释放结构体指针变量
struct LNode
{
char* date;
int size;
int num;
struct LNode* next;
}*root;
如果我这样定义一个结构体变量 再给date申请20个空间
free(root);
这样编译器给我释放的是怎么样的空间

root只是一个指向结构体的指针..照你上面说的.他并没有分配空间.哪来的释放?

你怎么给data申请20个空间?


[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-05-16 17:22
fantasyop
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2005-2-25
收藏
得分:0 

打住各位!!!
struct LNode
{
char* date;
int size;
int num;
struct LNode* next;
}*root; //结构体“指针变量”刚才没把这个指针打进去......

root = (struct LNode*)malloc(LEN);
root->date = (char *)malloc(20);
root->size = 100;
free(root);

这样编译器给我释放的是怎么样的空间


今年俺是大菜鸟,明年俺希望是小菜鸟,......
2006-05-16 17:26
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

#include<stdlib.h>
struct LNode
{
char* date;
int size;
int num;
struct LNode* next;
} *root;
void main()
{ root = (struct LNode*)malloc(sizeof(struct LNode));
root->date = (char *)malloc(20);
root->size = 100;
//.........................
free(root->date); //后申请,先释放
free(root);
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-16 17:35
fantasyop
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2005-2-25
收藏
得分:0 

谢谢,刚才傻掉了,忘了free不能释放结构体中的size num的整型变量的!!
把这帖删了吧!!!


今年俺是大菜鸟,明年俺希望是小菜鸟,......
2006-05-16 17:42
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
回复:(fantasyop)谢谢,刚才傻掉了,忘了free不能释...
以下是引用fantasyop在2006-5-16 17:42:00的发言:

谢谢,刚才傻掉了,忘了free不能释放结构体中的size num的整型变量的!!
把这帖删了吧!!!

此要求请“老版”酌定。


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-16 17:52
快速回复:[求助]关于free()函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018543 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved