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

先看下这段程序
#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有没有被真正的释放到?
希望有人可以回答,这个问题已经困扰我很久了!!

free只能释放由堆动态申请的空间,但是第一个中p,q两个不同的指针变量指向同一片地址,
free(q);
q = NULL;
后,q和p指向的空间被释放,且q被赋值为NULL,但是此时p变量的值并没有改变,即其值还是原来申请的空间的首地址。这里注意原来申请的空间已被释放,只是p还保留那篇空间的首地址值,所以一般开发中释放空间后,要把相关变量赋值为NULL,以防后面会非法访问一个已经释放的空间。
第二个,释放了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-09
先看下这段程序
#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指向的还是以前的地址,不过这个地址没有数据罢了
第2个回答  2012-03-09
有啊,不过最好再将p->next赋值为空,否则它还是指向那片空间的,用的时候会出现不确定的值追问

那为什么第一程序输出的是YES

追答

你是释放了p指向的空间了,但你没有将p赋空,所以p中在的地址还是存在的,只不过它指向的空间中的内容不确定了,你用*P输出的话就知道了, 所以用指针要注意很多问题的

本回答被提问者采纳
第3个回答  推荐于2017-09-08
函数原型: 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;
}
第4个回答  2012-03-09
啊实打实的

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网