为什么这个程序编译成功但无法运行?

时间:2017-08-02 07:41:27

标签: c loops

#include <stdio.h>
main()
{
int i=5;
    if(--i)
    {
        main();
        printf("%d ",i);
    }

请注意,如果我们将int i设为static,则答案为0000

3 个答案:

答案 0 :(得分:3)

每次输入函数i时,变量main()的值为 5 (每次调用main()都拥有自己的变量副本堆)。没有递归终止,因为永远不会满足递归终止的条件(即:--i永远不会计算为零)。 因此,递归调用main(),直到堆栈上没有其他位置。

如果您将i声明为static,则对i的所有调用都有一个变量main()的共享副本。当--i求值为零时,满足递归终止条件。

答案 1 :(得分:0)

它耗尽空间(在堆栈上),因为它正在调用main()unfinetely

答案 2 :(得分:0)

代码本身是正确的,程序将编译没有任何问题。问题是条件if (--i)将始终评估为true,因为每次递归调用main时,都会创建一个新的本地i变量并始终值5。当您堆叠越来越多的调用时,当堆栈不再增长时,程序将由SIGSEGV终止。你可以用Valgrind来观察这个:

==10972== Memcheck, a memory error detector
==10972== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==10972== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==10972== Command: ./a.out
==10972==
==10972== Stack overflow in thread #1: can't grow stack to 0xffe801000
==10972==
==10972== Process terminating with default action of signal 11 (SIGSEGV)

当您将0000声明为i变量时,该计划输出static的原因是因为i未在每次main次调用时重新声明。所以基本上main被递归调用,直到i0。然后,执行所有堆叠的printf,但在每个堆叠的调用中i0,您将看到0000static关键字使所有main次调用实际引用相同的i变量,而非副本。