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

时间:2019-04-21 15:14:53

标签: c

我使用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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

您已经free删除了内存,但这并不意味着指针已被系统无效。在第二种情况下,指向的数据尚未被重新使用,因此printf找到并可以打印。

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

但是这种不确定的行为,任何事情都可能发生。

答案 2 :(得分:1)

将变量设置为NULL时,可以更好地使用free。

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

调用free时,该变量被标记为可回收。何时应该重新分配分配的内存,取决于底层操作系统。您不应访问已释放的块。