C 打印函数未正确读取释放的值

C 打印函数未正确读取释放的值,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

我正在使用搜索树,为了查看树是否结束,我检查它是否为空。 我的问题是,当我使用free()时,指针值不会变为NULL

我也尝试过使用一个指向free的指针,然后设置为NULL,但没有成功

在这种情况下,我想删除搜索树上的最大数字,但我的print函数无法识别释放的值,而是打印0

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;