free函数为什么释放不了malloc分配的空间
大佬们,我用malloc给结构体里面的指针成员变量 int *a分配了10*int大小的空间,相对于就是一个int a的数组,可是为什么我释放不了空间呀,只是释放一部分。free(指向将要释放的内存空间的地址);
我写的就是 free(p->a)就第一个函数malloc分配的空间地址呀,可是为什么还释放不了呀。
希望大佬们可以解答一下疑惑,非常感谢!!!#include <stdio.h>
#include <stdlib.h>
struct std
{
int *a;
};
//给p->a申请10*int大小的空间
void show1(struct std *p)
{
p->a=(int *)malloc(10*sizeof(int));
}
//给p->a赋值
void show2(struct std *p)
{
int i,e;
for(i=0;i<5;i++)
{
scanf("%d",&e);
p->a=e;
}
}
//用free释放p->a
void show3(struct std *p)
{
int i;
//释放前,p->a的情况
printf("====\n");
printf("释放前\n");
for(i=0;i<5;i++)
{
printf("&p->a:%p\t",&p->a);
printf("p->a:%d\n",p->a);
}
free(p->a);
//释放后,p->a的情况
printf("====\n");
printf("释放后\n");
for(i=0;i<5;i++)
{
printf("&p->a:%p\t",&p->a);
printf("p->a:%d\n",p->a);
}
}
int main()
{
struct std p;
show1(&p);
show2(&p);
show3(&p);
return 0;
}
free()只是将malloc()函数申请的空间释放掉,并不能将指针置空,指针的指向还是之前的,并不会改变
没有释放之前,该空间一直归本程序使用,
释放掉之后,对应的空间可以被其他程序使用,之后再对该空间进行访问,可能就不是原来的值了。
释放空间,不是说该空间的值就一定会变。只是说该空间的值可以被其他程序修改了
举个例子吧
就像是老师去教室上课,语文老师(相当于你的程序)在了这间教室(访问的空间单元)上课,下课后没有擦黑板就走了。过了一会儿,你再去这间教室看的时候,黑板上可能还是语文老师写的东西,也可能有其他老师(另外的程序)在这间教室上过课,改掉了黑板的内容。
你这刚刚下课,就再去看黑板很可能是没有变的。但是具体什么时候变,那就看教务处(程序调度管理进程)的安排了,安排了其他课程,那么就变了,一直没安排,可能就会存在的时间比较长。 free(p->a); p->a = NULL; sunrise085 发表于 2020-4-15 09:29
free()只是将malloc()函数申请的空间释放掉,并不能将指针置空,指针的指向还是之前的,并不会改变
没有释 ...
开辟空间的意思就是,分配空间给这个程序,其他程序不能使用,对吧。
释放空间的意思就是,把分配到这个程序的空间,变成公用的,其他程序也可以使用,对吧。
大佬,我的这样理解正确吗。
我以前以为释放就是变回原来那样,里面什么都没了。
对了,那怎么查看已经释放了呀 wht666 发表于 2020-4-15 12:30
开辟空间的意思就是,分配空间给这个程序,其他程序不能使用,对吧。
释放空间的意思就是,把分配到这个 ...
不需要查看,因为free函数不会失败,调用free函数后就一定完成了释放 纠正一下,free函数有可能失败,如果free函数失败,那么free函数就不会返回,判断free函数是不是释放成功,可以看free函数后面的语句是不是执行了,如果free函数后面的语句没有执行,那就是free函数失败了
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char array = "1234";
free(array);
printf("hello world!\n");
return 0;
}
再纠正一下,可以通过查看全局变量 errno
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(void) {
char *array = malloc(10);
free(array);
perror("main.exe");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(void) {
char *array = malloc(10);
free(array + 1);
perror("main.exe");
return 0;
}
页:
[1]