wht666 发表于 2020-4-14 23:11:27

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;
}

sunrise085 发表于 2020-4-15 09:29:10

free()只是将malloc()函数申请的空间释放掉,并不能将指针置空,指针的指向还是之前的,并不会改变
没有释放之前,该空间一直归本程序使用,
释放掉之后,对应的空间可以被其他程序使用,之后再对该空间进行访问,可能就不是原来的值了。
释放空间,不是说该空间的值就一定会变。只是说该空间的值可以被其他程序修改了

举个例子吧
就像是老师去教室上课,语文老师(相当于你的程序)在了这间教室(访问的空间单元)上课,下课后没有擦黑板就走了。过了一会儿,你再去这间教室看的时候,黑板上可能还是语文老师写的东西,也可能有其他老师(另外的程序)在这间教室上过课,改掉了黑板的内容。
你这刚刚下课,就再去看黑板很可能是没有变的。但是具体什么时候变,那就看教务处(程序调度管理进程)的安排了,安排了其他课程,那么就变了,一直没安排,可能就会存在的时间比较长。

chxchxkkk 发表于 2020-4-15 09:36:32

free(p->a); p->a = NULL;

wht666 发表于 2020-4-15 12:30:59

sunrise085 发表于 2020-4-15 09:29
free()只是将malloc()函数申请的空间释放掉,并不能将指针置空,指针的指向还是之前的,并不会改变
没有释 ...

开辟空间的意思就是,分配空间给这个程序,其他程序不能使用,对吧。
释放空间的意思就是,把分配到这个程序的空间,变成公用的,其他程序也可以使用,对吧。
大佬,我的这样理解正确吗。
我以前以为释放就是变回原来那样,里面什么都没了。
对了,那怎么查看已经释放了呀

人造人 发表于 2020-4-15 13:01:32

wht666 发表于 2020-4-15 12:30
开辟空间的意思就是,分配空间给这个程序,其他程序不能使用,对吧。
释放空间的意思就是,把分配到这个 ...

不需要查看,因为free函数不会失败,调用free函数后就一定完成了释放

人造人 发表于 2020-4-15 13:06:22

纠正一下,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;
}

人造人 发表于 2020-4-15 13:14:15

再纠正一下,可以通过查看全局变量 errno
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(void) {
    char *array = malloc(10);
    free(array);
    perror("main.exe");
    return 0;
}

人造人 发表于 2020-4-15 13:14:46

#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]
查看完整版本: free函数为什么释放不了malloc分配的空间