| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 312 人关注过本帖
标题:free()函数释放疑问求解答。。。
只看楼主 加入收藏
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
结帖率:90%
收藏
已结贴  问题点数:20 回复次数:1 
free()函数释放疑问求解答。。。
程序是书上答案,要写个函数 New() 对 n 个字符开辟连续的存储空间。函数返回指针,指向字符串开始的空间。
写个函数 free() 对将New()函数占用的空间释放。
主要疑问在最后一句。。。。。。
char ch[1000];//定义足够大的连续空间
char* pch = ch;//把字符串的首地址给指针变量pch
char *New(n)//函数不完整,n没有定义。 这函数只是对 n个字符开辟连续的存储空间。
{
    if(pch+n <= ch+1000)//pch+n要小于ch+1000开辟的连续空间
    {
        pch = pch+n;//把pch+n的地址给pch。
        return(pch-n);//pch的原来地址是字符串的首地址,现在是pch+n的地址,pch-n是把pch的地址返回给函数。
    }
    else return(NULL);//如果pch+n大于ch+1000的连续空间了。则不能再进行连续空间的分配了。返回NULL。
}
free(char *p)//p接收的地址应该就是New()函数的返回值,它是释放上面开辟的内存空间的。
{
    if((p >= ch) && (p <= ch+1000))//p要在连续空间的范围内。
        pch = p;//可是为什么把 p的地址再给一次pch 这内存空间就被释放了呢?
}

pch = p;//可是为什么把 p的地址再给一次pch 这内存空间就被释放了呢?函数运行把 pch 变到了字符串的尾部位置,p 接收的是字符串的首地址,
          把 p 赋给 pch。就是让pch的地址回到字符串的首地址。为什么这样就是释放了空间呢?????
2015-11-25 11:32
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:20 
以下是引用朔源在2015-11-25 11:32:03的发言:

pch = p;//可是为什么把 p的地址再给一次pch 这内存空间就被释放了呢?函数运行把 pch 变到了字符串的尾部位置,p 接收的是字符串的首地址,把 p 赋给 pch。就是让pch的地址回到字符串的首地址。为什么这样就是释放了空间呢?????


pch指向未分配的连续空间的地址,将p赋给 pch,你可以理解成将p所分配的空间和未分配的这空间连起来,最后的结果就是这一段空间(P+未分配这空间)成为未分配的空间,pch既然只记录未分配连续空间的地址,那下次分配空间时,又从pch指向的未分配的空间中开始分配,前面的p指向的空间块也在pch记录的未分配空间内,这当然就是程序意义上的“释放”,
可能文字有点拗口,不好意思。你可以在图上画一下就知道了。

但是,有个问题在里面,谁先分配?谁先释放?书上代码基本没有解释。
比如:分配一个块给P1,分配第二个块给p2,用那个答案的函数进行释放p1,再分配一个前面二个块合起来大小的空间给P3,对P3空间进行改值操作,则可以直接将P2那部分块的内容给改掉,此时P2并没有释放啊??简单点说就是释放P1时,同时把P2的空间也给释放了。我汗

[此贴子已经被作者于2015-11-25 14:37编辑过]


我们都在路上。。。。。
2015-11-25 14:28
快速回复:free()函数释放疑问求解答。。。
数据加载中...
 
   



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

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