即使在基本情况下调用递归函数时也会无限循环
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))
这段代码我看不懂。我想我知道的是,当我传递 "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))