我无法理解这个C代码在执行时如何产生堆栈溢出?执行步骤是什么?请帮助。
#include <stdio.h>
int main() //Main function
{
reverse(1);
}
void reverse(int i) //Reverse function
{
if (i > 5)
exit(0);
printf("%d\n", i);
return reverse(i++);
}
答案 0 :(得分:2)
#include <stdio.h>
int main()
{
reverse(1);
}
void reverse(int i)
{
if (i > 5)
exit(0);
printf("%d\n", i);
return reverse(i++);
}
在这一行return reverse(i++);
上你告诉你的代码在返回后添加1到i是无意义的
你必须return reverse(++i);
它会在返回之前为我添加1
这就是你的程序崩溃的原因。然后还有一件事就是在虚函数上使用return
选择
int reverse(int i)
或
reverse(++i); // last line
最终代码:
#include <stdio.h>
#include <stdlib.h> // exit function
int reverse(int i)
{
if (i > 5)
exit(0);
printf("%d\n", i);
return reverse(++i);
}
int main()
{
reverse(1);
}
编辑本文评论中的第二个问题
#include <stdio.h>
#include <stdlib.h> // exit function
void reverse(int i) {
if (i > 5)
return ;
printf("%d ", i);
return reverse((i++, i));
}
int main()
{
reverse(1);
}
我必须告诉你我之前从未见过这个合成器,但正如我告诉你的那样action(i++);
我的行动被设定后会设定新值(它被称为后增量,其中++i
称为预增量)
这里添加(i++, i)
允许您通过后增量将i值设置为i + 1。这个synthax完全无用,你应该使用++i
代替。 (i++, i)
它只是一种表示增加帖子的方法,但现在就去做(这是无意义的)
答案 1 :(得分:2)
您的函数以 1 的参数递归调用,直到堆栈上没有更多空间为止。
我想您要使用++i
而不是i++
。
答案 2 :(得分:1)
return reverse(i++);
此行调用reverse
,其当前值为i
,然后会增加它。这意味着您无限次地调用reverse(1)
(或至少尝试;最终,正如您所注意到的,堆栈已填满并且您遇到堆栈溢出)。
另外,返回void
函数并没有多大意义。
答案 3 :(得分:0)
您应该了解表达式和副作用。表达式在评估时具有值,例如1 + 2
具有值3
。副作用会改变一些状态。
C中的++
和--
运算符为您提供:它们评估为某个值,作为副作用,它们会更改变量。 ++i
和i++
都将1
添加到i
(副作用),但++i
评估为之后的值递增它,而i++
在>>递增之前计算值。
在编写递归函数时,根本不需要副作用!它通常是整个递归点以避免副作用(它们在函数式编程中被禁止,因此递归是一种常用的技术)。所以,只需编写没有副作用的实现:
return reverse(i + 1);
答案 4 :(得分:0)
问题是您的递归函数void reverse(int i)
一次又一次地在1
上调用。
这是因为行 - return reverse(i++);
i++
是后缀表达式
后缀增量或减量操作的结果是操作数的值。获得结果后,操作数的值递增(或递减)
为避免stackoverflow问题,您可以return reverse(i++);
或return reverse(++i);
reverse(i+1);
答案 5 :(得分:0)
其他部分在其他答案中进行了解释,但由于它是void
函数,因此您只需忽略关键字return
,并在main
使用之前放置原型。
由于此函数是递归函数,因此使用参数main
从1
调用它一次启动函数,并继续以递归方式调用它,直到if
语句中的条件为真。
#include <stdio.h>
#include<stdlib.h>
void reverse(int);
int main() {
reverse(1);
}
void reverse(int i){
if (i > 5)
exit(0);
printf("%d\n", i);
reverse(++i);
}