为什么只有一个free()适用于这段代码?

问题描述 投票:2回答:3

我使用free()来释放我之前分配的结构,并且我想测试它们是否已成功免费,但我只获得其中一个免费为什么?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct student{
    char *name;
    struct student *next;
}student;
int main(int argc, const char * argv[]) {
    student *a=malloc(sizeof(student));
    a->name="echo";
    student *b=malloc(sizeof(student));
    b->name="harry";
    a->next=b;
    b->next=NULL;
    free(a);
    free(b);
    printf("%s\n", a->name);
    printf("%s\n", b->name);
    return 0;
}

我得到了这个输出。为什么?

(null)
harry
Program ended with exit code: 0
c
3个回答
4
投票

您无法“测试”它们是否已成功释放,尝试访问已释放的任何内存是未定义的行为,而不是仅测试接受和继续。


2
投票

你有freed内存,但这并不意味着指针已被系统无效。在你的第二种情况下,它指向的数据尚未重复使用,所以printf找到它并可以打印。

  • 在第一种情况下,存储器已被重新使用或重置。 print找到一个空指针。
  • 在第二种情况下,内存尚未重复使用:printf找到它并可以打印它。

但这种未定义的行为和任何事情都可能发生。


1
投票

您可以更好地使用free并将变量设置为NULL

free(b);
b = NULL;
free(a);
a = NULL;

当你调用free时,变量被标记为重新收集。并且当分配的内存的回忆应该发生时,取决于底层操作系统。您不应该访问释放的块。

© www.soinside.com 2019 - 2024. All rights reserved.