我无法理解这段代码。我想我知道的是,当我通过x
时,void foo1(char* x)
{
if (!x)
return;
printf("%c ",*x);
foo1(++x);
}
int main()
{
foo1("abc");
return 0;
}
成为指向字符串中第一个元素的指针,这是正确的吗?为什么它会给我无限循环?
这是我的代码:
{{1}}
答案 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
答案 4 :(得分:0)
您不仅要检查指针值,还要检查字符串的结尾。 如果(* x)仅检查指针值,则编码。如果(!x&amp;&amp;!(* x))
,您还需要检查字符串元素值