即使在基本情况下调用递归函数时也会无限循环

infinite loop when callling recursive function even with base case

这段代码我看不懂。我想我知道的是,当我传递 "abc" 然后 x 变成指向字符串中第一个元素的指针,这是正确的吗?为什么它给我无限循环?

这是我的代码:

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

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

当指针变为 null 时,您停止迭代。您真正想要的是在到达 [=12=] 字符(即字符串末尾)时停止迭代:

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

  return 0;
}

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

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

因为您是在指针值而不是指向的项目上迭代,所以您基本上会从字符串的位置开始迭代进程地址 space。在到达导致分段错误的无效地址之前,您可能 运行 出栈 space!

问题出在你的终止条件

if (!x)
    return;

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

这个测试是错误的:

if (!x)

您只是在测试 x 是否为 0,而这从未发生过,因此基本情况也从未发生过。

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

if (x[0] == 0) 

您不仅需要检查指针值,还需要检查字符串结尾。 您编写 if(*x) 仅检查指针值。您还需要检查字符串元素值 if(!x && !(*x))