gpt4 book ai didi

C 比较后初始化变量的值自行改变

转载 作者:行者123 更新时间:2023-11-30 16:48:07 24 4
gpt4 key购买 nike

我正在用 C 语言实现一个简单的树结构。该程序显示了一些奇怪的行为,我能够将其范围缩小到一个位置,其中存储在内存位置并使用指针访问的值意外更改。它是可复制的,但仅在递归函数运行几次(确定性地取决于输入)后才会发生。它位于“while”语句标题中的某个位置。我已经检查过,就在“while”之前,所有指针都指向预期的、明确定义的等内容的内存单元。最让我烦恼的是,即使我将值的副本分配给另一个变量,该变量也会发生变化。我不知道这怎么可能,尽管我怀疑我遗漏了一些明显的东西。下面是相关的代码片段。

typedef struct _Node {
int root;
struct _Node *children;
struct _Node *next;
struct _Node *previous;
} Node;

int delete_subtree_aux(Node *n) {

Node *children = get_children(n);

int i = children->root;
int j = i;

// At this point i and j both equal e.g. -4

while (!(children->next->root == children->root)) {

i = children->root;

// At this point i equals -3

assert(i == j);

// And j equals -3 too!

delete_subtree_aux(get_first(children));

}

free_node(children);
}

非常感谢所有帮助!

编辑:

free_node(children); 设置额外断点后,我注意到执行指令的顺序有些问题。程序一度直接从 free_node(children); 绕过 while 条件检查进入循环内部。 'n'、'i'、'j' 和 'children' 一起变化并对应不同的函数输入。设置数据断点显示不同的“j”位于两个不同的内存地址。

在我看来,由于某种原因,这个函数的一些实例以某种方式并行执行,但这不是我的意图。我的后续问题是,在这种情况下释放内存会导致错误吗?如果是,我应该做什么来解决它?

编辑2:上面代码中调用的其他函数的来源:

int free_node(Node *n) {
free(n);
}

Node *get_children(Node *n) {
return n->children;
}

Node *get_first(Node *list) {
return list->next;
}

最佳答案

问题是当 get_first(children) == get_last(children) while 循环应该有最后一次迭代。然而,delete_subtree_aux无法更新位置 children->next指着。当children该地址处的节点被释放, while 循环没有停止,而是尝试再进行一次迭代(因为 children->next 指向内存中的一些类似 Node 的垃圾,与 children 不同)。然而这一次,它尝试访问 free'd children ,这当然会导致错误。

之前while之间“i”、“j”、“children”和“n”的神秘变化和内部是查看堆栈上不同级别的递归函数的结果,正如@Holsety 在评论中指出的那样。

关于C 比较后初始化变量的值自行改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43106047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com