这个C代码如何在执行时产生堆栈溢出?执行步骤是什么?

时间:2017-05-15 14:39:27

标签: c function stack output

我无法理解这个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++);
    }

6 个答案:

答案 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中的++--运算符为您提供:它们评估为某个值,作为副作用,它们会更改变量。 ++ii++都将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使用之前放置原型。 由于此函数是递归函数,因此使用参数main1调用它一次启动函数,并继续以递归方式调用它,直到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);
    }