C语言中的free函数如何正确使用

先看下这段程序#include<stdio.h>#include<malloc.h>voidmain(){int*p=(int*)malloc(sizeof(int)*5... 先看下这段程序
#include <stdio.h>
#include <malloc.h>
void main()
{
int *p=(int *)malloc(sizeof(int)*5);
int *q;
q=p;
free(q);
q=NULL;
if(p)printf("yes");
else printf("no");
}
输出结果是yes,这个时候p,q指向同一段内存空间为什么释放不了呢?是不是一定要free(p)才能释放?

再看看这段链表的删除结点的程序(课本上面的)
int ListDelete(SLNode *head,int i,DataType *x)
{

SLNode *p,*s;
int j;
p=head;
j=-1;
while(p->next!=NULL&&p->next!=NULL&&j<i-1)
{

p=p->next;
j++;
}
if(j!=i-1)
{

printf("删除位置出错!");
return 0 ;
}
s=p->next;
*x=s->data;
p->next=p->next->next;
free(s);
return 1;
}
程序将p->next赋值给s,然后free(s)那么p->next有没有被真正的释放到?
希望有人可以回答,这个问题已经困扰我很久了!!
展开
 我来答
百度网友3a9d545
2012-03-09 · 超过22用户采纳过TA的回答
知道答主
回答量:154
采纳率:100%
帮助的人:64.5万
展开全部
free只能释放由堆动态申请的空间,但是第一个中p,q两个不同的指针变量指向同一片地址,
free(q);
q = NULL;
后,q和p指向的空间被释放,且q被赋值为NULL,但是此时p变量的值并没有改变,即其值还是原来申请的空间的首地址。这里注意原来申请的空间已被释放,只是p还保留那篇空间的首地址值,所以一般开发中释放空间后,要把相关变量赋值为NULL,以防后面会非法访问一个已经释放的空间。
第二个,释放了。
帐号已注销
2012-03-09 · TA获得超过729个赞
知道小有建树答主
回答量:1123
采纳率:0%
帮助的人:878万
展开全部
先看下这段程序
#include <stdio.h>
#include <malloc.h>
void main()
{
int *p=(int *)malloc(sizeof(int)*5);
int *q;
q=p;
free(q);
q=NULL;
if(p)printf("yes");
else printf("no");
}
输出结果是yes,这个时候p,q指向同一段内存空间为什么释放不了呢?是不是一定要free(p)才能释放?
q=p; 这时只是将p所指向的地址赋值给q,所以free(q)对p没有影响,你可以这么做q=&p

第二个程序是s=p->next;free(s)后,p->next指向的还是以前的地址,不过这个地址没有数据罢了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
love_zhai
2012-03-09 · TA获得超过111个赞
知道小有建树答主
回答量:157
采纳率:0%
帮助的人:100万
展开全部
有啊,不过最好再将p->next赋值为空,否则它还是指向那片空间的,用的时候会出现不确定的值
追问
那为什么第一程序输出的是YES
追答
你是释放了p指向的空间了,但你没有将p赋空,所以p中在的地址还是存在的,只不过它指向的空间中的内容不确定了,你用*P输出的话就知道了,  所以用指针要注意很多问题的
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hwd0312
推荐于2017-09-08 · TA获得超过4336个赞
知道小有建树答主
回答量:1043
采纳率:100%
帮助的人:163万
展开全部
函数原型: void free(void *ptr)
参数: 任何类型的指针(指向因调用malloc、realloc以及calloc函数分配得到的空间的指针)
功 能: 释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及calloc函数来再分配。
注意:free一定是和malloc、realloc或者calloc函数成对出现的,来保证动态分配的空间及时释放,否则会造成内存泄漏,这是正确使用free的一个重要前提,还有就是一块动态申请的内存用free释放一次就够了。
实例:
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main(void)
{
char *str;
/* allocate memory for string */
str = (char *)malloc(10);
if(str == NULL){
perror("malloc");
exit(1);
}
/* copy "Hello" to string */
strcpy(str, "Hello");
/* display string */
printf("String is %s\n", str);
/* free memory */
free(str);
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
三千碎月
2012-03-09
知道答主
回答量:9
采纳率:0%
帮助的人:4万
展开全部
啊实打实的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式