| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1583 人关注过本帖
标题:[求助]一个指针释放的问题
只看楼主 加入收藏
lizhijie
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-4-28
收藏
得分:0 

我的理解:
经过8楼的启发,我认为我的原程序的一个致命的地方是 p=(char **)malloc(num);指针是无符号整数,占4个字节,应该改为p=(char **)malloc(num*sizeof(int));
照原来的程序,当执行完后,p已超出了其之前malloc分配的范围,已指向一个未知的内存,会导致系统崩溃,我还认识到要想用free来释放之前malloc分配的内存,该指针必须指在该内存的首地址,通过很多次调试得出的结论。所以最后改为:

#include<stdio.h>
#include<stdlib.h>
void main()
{
char **p;
int num;
int i;
printf("input you number:");
scanf("%d",&num);

p=(char **)malloc(num*sizeof(int));
for(i=0;i<num;i++)
{
if((p[i]=(char*)malloc(20))==NULL)
{
printf("ERROR");
exit(0);
}
scanf("%s",p[i]);
}
for(i=0;i<num;i++)
{
printf("%s\n",p[i]);
free(p[i]);
}
free(p);
}


2007-05-07 14:58
ibiancheng
Rank: 1
等 级:新手上路
帖 子:148
专家分:0
注 册:2007-4-3
收藏
得分:0 

请教下大虾门:
free(p);/*它释放的是p指向的内存区,是将这段内存区的数据清除?还是怎么处理的???
还有就是释放之后p还指向这段内存区吗???还是就不再指向这段内存了不??*/
谢谢哪位能够指点下


执著的信念,坚定的自信,勤奋的努力才是通向成功的捷径! !!
2007-05-11 19:21
lizhijie
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-4-28
收藏
得分:0 
free函数释放的是在函数执行期间动态分配的堆空间,不是编译期间分配的内存,两者有本质的区别。后者待程序结束后由操作系统释放,前者必须在程序期间用free释放,否则就是所说的内存泄露了。

释放后清不清除数据我也不知道了,只是释放后这段内存就可以被再次利用,否则不可以。
释放之后p就是没有指向的野指针了。应设为NULL

以上是我的理解,请高手指正!

2007-05-11 23:10
linsq
Rank: 1
等 级:新手上路
帖 子:120
专家分:0
注 册:2006-11-20
收藏
得分:0 
if((p[i]=(char*)malloc(20))==NULL)

搞不清楚其中“20”的意思..

2007-05-12 09:41
lizhijie
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-4-28
收藏
得分:0 
没什么意思,只是分配20个字节的内存存放你要输入的字符串,可以根据需要调整。

2007-05-12 19:15
ruomeichen
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-5-25
收藏
得分:0 
不错不错
2007-05-14 21:25
acmilann
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2007-5-13
收藏
得分:0 

同意十一楼的观点。首先释放指针,再释放指向指针的指针。这个小程序确实值得大家推敲!


学习编程的秘诀是:编程,编程,再编程
2007-05-15 08:39
Javal
Rank: 1
等 级:新手上路
威 望:1
帖 子:108
专家分:0
注 册:2006-5-7
收藏
得分:0 

我的修改意见:

#include<stdio.h>
#include<stdlib.h>
void main()
{
char **p;
int num;
int i;
printf("input you number:");
scanf("%d",&num);

p=(char **)malloc(num*sizeof(char *)); // 这样程序的可移植性会好些
for(i=0;i<num;i++)
{
if((p[i]=(char*)malloc(20))==NULL)
{
printf("ERROR");
exit(0);
}
scanf("%s",p[i]);
}
for(i=0;i<num;i++)
{
printf("%s\n",p[i]);
free(p[i]);
}
free(p);
}


猝然临之而不惊,无故加之而不怒 /?spaced" target="_blank">Linux C资料
2007-05-15 09:38
快速回复:[求助]一个指针释放的问题
数据加载中...
 
   



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

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