gpt4 book ai didi

C 字符串递归堆栈复制还是...?

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

假设我有。

 char c[500]; 

我为我的作业编写了以下函数:(基本上,它是一棵树,中缀顺序,如果左节点存在,则在 i 位置写入 0(1 代表右节点)到缓冲区,否则写入 '\0' 并打印缓冲区)。

void imprimer_codes (node *b, char *c, int i) {
assert(c);
if (!b) return;

if (est_feuille(b)) {
c[i] = '\0';
printf("%s:%c\n",c,b->symbol);
}

if (b->fg) {
c[i] = '0';
imprimer_codes(b->fg,c,i+1);
}

if (b->fd) {
c[i] = '1';
imprimer_codes(b->fd,c,i+1);
}
}

因为我正在递归地使用它。我不明白该函数如何实际打印多个不同的缓冲区,因为缓冲区中有多个\0。

指向c[500]的指针是否被复制到堆栈内存?这可能是我能找到的唯一解释。

最佳答案

Since I am using it recursively. I don't understand how the function can actually print multiple different buffer since there's multiple \0 into the buffer.

这很简单。作为一个例子,考虑一棵树,

   *
/ \
x ...

也就是说,左边有一片叶子,右边有一些子树。我们从,

i = 0, c = [] 

你的算法首先向左走(仍然必须向右走),

i = 1, c = [0]

这是一个叶子,所以它添加了 null,

i = 1, c = [0, \0]

并打印。该分支已完成,因此它会回溯,我们已经,

i = 0, c = [0, \0]

记住i是按值传递的,但c是一个数组,而数组是按引用传递的。那么我们向右走,

i = 1, c = [0, 1]

并且 null 消失了。

再举一个例子,其中 null 未被覆盖。考虑一下,

    *
/ \
/ y
x

你向左走两次,

i = 0, c = []
i = 1, c = [0]
i = 2, c = [0, 0]

然后添加 null 并打印

i = 2, c = [0, 0, \0]    

因为根部只有一个右分支,所以它将回溯到那里,

i = 0, c = [0, 0, \0]     

然后就正常了,

i = 1, c = [1, 0, \0]     

它是一片叶子,所以我们将添加 null 并打印它,

i = 1, c = [1, \0, \0]     

我认为这应该足以理解发生了什么。

插入 \0 后立即回溯到较小的 i,并从那里继续构建新字符串。因此,在任何时候,您当前的 i 之前的位置都不会出现 \0

关于C 字符串递归堆栈复制还是...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53598222/

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