打印功能无法正确读取释放值

时间:2017-05-28 01:14:36

标签: c memory null free search-tree

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

我还尝试使用指针来释放然后设置为NULL但它没有工作。

在这种情况下,我想删除搜索树上的最大数字,但我的打印功能无法识别释放的值,而是打印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;
}

2 个答案:

答案 0 :(得分:4)

在指针上调用free()后,它不会将指针设置为null,而是使其无效。这意味着进一步访问该指针地址会导致未定义的行为。您无法访问或打印已释放的内存中的信息。但是,您可以释放指针然后立即将其设置为null - 这是完全有效的事情。如果你已经这样做但仍然有问题,那么我怀疑你的问题出在其他地方。

答案 1 :(得分:2)

这是预期的行为。您可以在The GNU C Library上找到有关free()功能的文档。

  

释放块会改变块的内容。在释放它之后,不要指望在块中找到任何数据(例如指向块链中下一个块的指针)。

如Hiko所述,最好在致电NULL后将指针指定给free()

所以,

free (b);
b = NULL;

将解决您的问题。

编辑:根据@Seb在评论中的建议,同时选中The POSIX manual for free()