【问题标题】:C String recursion stack copy or...?C字符串递归堆栈复制或......?
【发布时间】:2019-05-05 00:15:40
【问题描述】:

假设我有。

 char c[500]; 

我为我的作业编写了以下函数: (基本上是一棵树,中缀顺序,如果左节点存在,则将 0(1 表示右)写入缓冲区 i 位置,否则写入 '\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] 的指针复制到堆栈内存中?这可能是我能找到的唯一解释。

【问题讨论】:

  • 请发一个完整的代码。
  • 我认为您递归使用它并且尝试将字符存储到缓冲区中这一事实有点棘手。想象一下你有` i = 5` 它可以输入if (b->fg) 和if (b -> fd) 然后两者都可以写在c[5] 也许这是你想要考虑的事情。你\0... 也会发生同样的行为
  • est_feuille 是 is_leaf 的法语,所以我想这意味着没有子节点了
  • 我猜fg 和fd 代表左右分支(g = gauche = left, d = droit = right)
  • 现在是开始使用调试器的好时机。您可以单步执行您的代码并查看您的进展情况...

标签: c string recursion memory stack


【解决方案1】:

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

这很简单。以一棵树为例,

   *
 /   \
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 消失了。

再举一个不覆盖空值的例子。考虑一下,

    *
  /   \
 /     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。

【讨论】:

    猜你喜欢
    • 2015-09-12
    • 2017-01-20
    • 2022-01-09
    • 2013-06-16
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多