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


#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);
for(i=0;i<num;i++)
{
if(!(p[i]=(char*)malloc(20)))
{
printf("ERROR");
exit(0);
}
scanf("%s",p[i]);
}
for(i=0;i<num;i++)
{
printf("%s\n",p[i]);
}

//一般来说使用完指针之后要释放该指针指向的内容,比如这里我认为应该加上free(p)但是能通过编译,却执行不了。
//我用的是VC 6.0,请指点!

}

搜索更多相关主题的帖子: 指针 释放 
2007-05-02 13:37
lizhijie
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-4-28
收藏
得分:0 
回二楼:

if(!(p[i]=(char*)malloc(20)))
{
printf("ERROR");
exit(0);
}
是给字符串指针分配内存,若分配失败,就执行{ printf("ERROR"); exit(0);}。

char **p也是指针,所以我想给p分配内存也要做强制类型转换,所以p=(char **)malloc(num);不知道我的想法对不对,还请指教。

2007-05-02 22:16
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
lizhijie
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-4-28
收藏
得分:0 
free函数释放的是在函数执行期间动态分配的堆空间,不是编译期间分配的内存,两者有本质的区别。后者待程序结束后由操作系统释放,前者必须在程序期间用free释放,否则就是所说的内存泄露了。

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

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

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

2007-05-12 19:15
快速回复:[求助]一个指针释放的问题
数据加载中...
 
   



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

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