在使用基本情况调用递归函数时的无限循环

时间:2018-01-17 11:20:18

标签: c recursion c-strings

我无法理解这段代码。我想我知道的是,当我通过x时,void foo1(char* x) { if (!x) return; printf("%c ",*x); foo1(++x); } int main() { foo1("abc"); return 0; } 成为指向字符串中第一个元素的指针,这是正确的吗?为什么它会给我无限循环?

这是我的代码:

{{1}}

5 个答案:

答案 0 :(得分:2)

当指针变为null时,您停止迭代。你真正想要的是当你到达\0字符(即字符串的结尾)时停止迭代:

int main()
{
  foo1("abc");

  return 0;
}

void foo1(char* x)
{
  if (*x == 0)
      return;

  printf("%c ",*x);
  foo1(++x);
}

因为您正在迭代指针值而不是指向的项,所以您基本上开始迭代进程地址空间,从字符串的位置开始。在找到导致分段错误的无效地址之前,您可能会耗尽堆栈空间!

答案 1 :(得分:0)

问题出在你的终止条件

if (!x)
    return;

您的指针x永远不会变为0(或NULL)。所以它永远不会终止。

答案 2 :(得分:0)

此测试错误:

if (!x)

你只是测试x是否为0并且这种情况永远不会发生,因此基本情况永远不会发生。

相反,您需要检查x 指向是否为NUL字符(字符串以NUL字符终止):

if (x[0] == 0) 

答案 3 :(得分:0)

您的函数应检查空字符,即\0,因为它是以空字符结尾的字符串。但是,在您的情况下,您正在检查指针是否不是NULL,它永远不会变为无限循环。

这是我的功能变体:

#include <stdio.h>

void foo1(char* x)
{
    if ( *x )
    {
        printf("%c ",*x);
        foo1(++x);
    }
}

int main()
{
    foo1("abc");
    return 0;
}

<强>输出:

  

a b c

实例:https://ideone.com/dc7WK4

答案 4 :(得分:0)

您不仅要检查指针值,还要检查字符串的结尾。 如果(* x)仅检查指针值,则编码。如果(!x&amp;&amp;!(* x))

,您还需要检查字符串元素值