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有没有被真正的释放到?
希望有人可以回答,这个问题已经困扰我很久了!! 展开
#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有没有被真正的释放到?
希望有人可以回答,这个问题已经困扰我很久了!! 展开
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)才能释放?
q=p; 这时只是将p所指向的地址赋值给q,所以free(q)对p没有影响,你可以这么做q=&p
第二个程序是s=p->next;free(s)后,p->next指向的还是以前的地址,不过这个地址没有数据罢了
#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指向的还是以前的地址,不过这个地址没有数据罢了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有啊,不过最好再将p->next赋值为空,否则它还是指向那片空间的,用的时候会出现不确定的值
追问
那为什么第一程序输出的是YES
追答
你是释放了p指向的空间了,但你没有将p赋空,所以p中在的地址还是存在的,只不过它指向的空间中的内容不确定了,你用*P输出的话就知道了, 所以用指针要注意很多问题的
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
函数原型: 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;
}
参数: 任何类型的指针(指向因调用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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询