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