C 打印函数未正确读取释放的值
我正在使用搜索树,为了查看树是否结束,我检查它是否为空。 我的问题是,当我使用free()时,指针值不会变为NULL 我也尝试过使用一个指向free的指针,然后设置为NULL,但没有成功 在这种情况下,我想删除搜索树上的最大数字,但我的print函数无法识别释放的值,而是打印0C 打印函数未正确读取释放的值,c,memory,null,free,search-tree,C,Memory,Null,Free,Search Tree,我正在使用搜索树,为了查看树是否结束,我检查它是否为空。 我的问题是,当我使用free()时,指针值不会变为NULL 我也尝试过使用一个指向free的指针,然后设置为NULL,但没有成功 在这种情况下,我想删除搜索树上的最大数字,但我的print函数无法识别释放的值,而是打印0 typedef struct nodo { int val; struct nodo *l, *r; } *ABin; void print (ABin a) { if (a != NUL
typedef struct nodo {
int val;
struct nodo *l, *r;
} *ABin;
void print (ABin a) {
if (a != NULL) {
print (a -> l);
printf(" %d ",a -> val);
print (a -> r);
}
}
ABin remBiggerA (ABin *a) {
ABin b = (*a), aux = b;
int i = 0;
if (b == NULL) i = 1;
while (i == 0) {
if (b -> r == NULL) {
free (b);
i = 1;
}
else b = b -> r;
}
(*a) = aux;
return aux;
}
对指针调用
free()
后,它不会将指针设置为null,而是使其无效。这意味着进一步访问该指针地址会导致未定义的行为。您无法从已释放的内存中访问或打印信息。但是,您可以释放一个指针,然后自己立即将其设置为null——这是一个非常有效的方法。如果您已经这样做了,但仍然存在问题,那么我怀疑您的问题出在其他地方。在对指针调用free()
后,它不会将指针设置为null,而是使其无效。这意味着进一步访问该指针地址会导致未定义的行为。您无法从已释放的内存中访问或打印信息。但是,您可以释放一个指针,然后自己立即将其设置为null——这是一个非常有效的方法。如果您已经这样做了,但仍然存在问题,那么我怀疑您的问题在其他地方。这是预期的行为。您可以在上找到有关free()
函数的文档
释放块会更改块的内容。释放块后,不要期望在块中找到任何数据(例如指向块链中下一个块的指针)
正如Hiko所提到的,在调用free()
之后,将指针分配到NULL
是一种很好的做法
所以
这会解决你的问题
编辑:根据@Seb在评论中的建议,也请检查。这是预期的行为。您可以在上找到有关
free()
函数的文档
释放块会更改块的内容。释放块后,不要期望在块中找到任何数据(例如指向块链中下一个块的指针)
正如Hiko所提到的,在调用free()
之后,将指针分配到NULL
是一种很好的做法
所以
这会解决你的问题
编辑:根据@Seb在评论中的建议,也要检查。使用
typedef
指针通常不是一个好主意。根据提供的信息,我已经给出了最好的答案,但如果您将释放的指针设置为null,并且空值检查仍然没有注册,那么您会遇到完全不同的问题(几乎可以肯定是基于逻辑的)问题。是否可以发布一个最小的可验证示例?使用typedef
指针通常不是一个好主意。根据提供的信息,我已经给出了最好的答案,但是如果您将释放的指针设置为null,并且空值检查仍然没有注册,那么您会遇到完全不同的问题(几乎可以肯定是基于逻辑的)问题。是否可以发布一个最低限度的可验证示例?我建议大家参考POSIX(opengroup)手册,而不是GNU手册;前者更准确,更符合标准,不太强调扩展。尽管如此,将OP指向手册是一个好主意!也许您应该添加“指针的任何用法”您在glibc文档中添加的手动链接中的文本,以防将来页面移动。我建议大家参考POSIX(opengroup)手册,而不是GNU手册;前者更准确,更符合标准,不太强调扩展。尽管如此,将OP指向手册是一个好主意!也许您应该添加“指针的任何用法”您为glibc文档添加的手动链接中的文本,以防将来页面移动。
free (b);
b = NULL;