我使用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
答案 0 :(得分:4)
您无法“测试”它们是否已成功释放,尝试访问已释放的任何内存都是未定义的行为,而不是仅测试接受并继续运行。
答案 1 :(得分:2)
您已经free
删除了内存,但这并不意味着指针已被系统无效。在第二种情况下,指向的数据尚未被重新使用,因此printf
找到并可以打印。
print
找到一个空指针。printf
找到并可以打印。但是这种不确定的行为,任何事情都可能发生。
答案 2 :(得分:1)
将变量设置为NULL
时,可以更好地使用free。
free(b);
b = NULL;
free(a);
a = NULL;
调用free
时,该变量被标记为可回收。何时应该重新分配分配的内存,取决于底层操作系统。您不应访问已释放的块。