是否对函数的每次递归调用使用相同的静态变量?

时间:2014-06-18 02:48:46

标签: c recursion static

根据我的理解,每个被调用的函数在程序堆栈中都有一些分配给它的内存,即使同一个函数以递归方式调用自身也是如此(即,每个调用在程序堆栈中都有自己的内存)。请回答以下两个问题:

如果变量在函数中声明为static,那么同一个变量/同一个副本是否会用于该函数的所有递归调用?

如果变量未声明为static(例如,简称为“int x”),那么对函数的每次递归调用都会有自己的变量副本吗?如果是,那是从其他函数调用函数时通常会发生的情况,包括递归调用吗?

#include<stdio.h>
#include<stdlib.h>

int main()
{
    static int x=0;
    x++;
    printf("Team %d\n",x);
    if(x<10)
        main();
    else
        exit;
}

输出:

Team 1
Team 2
Team 3
Team 4
Team 5
Team 6
Team 7
Team 8
Team 9
Team 10

3 个答案:

答案 0 :(得分:13)

  

如果变量在函数中声明为static,则会相同   变量/相同副本是否用于该函数的所有递归调用?

是的,正如您的代码示例所示

  

如果变量未声明为静态(例如,简称为“int x”),则会   每次递归调用函数都有自己的副本   变量?如果是,那就是它在函数中通常发生的方式   从其他函数调用,包括递归调用?

是的,每个调用都有自己的堆栈帧,每个局部变量都有一个副本。这是每个函数调用发生的事情,无论它们是否递归。是的,这个原则允许,其中包括递归。

答案 1 :(得分:5)

静态变量存在于程序的生命周期中,只有一个副本

Locals(Autos)在每个函数调用的堆栈上获取一个新副本。

按值传递的参数也会获得一个新副本。

通过引用传递的参数(指针)指向传递给它们的副本。因此,如果它是递归执行中的本地,它可能是唯一的副本;但通常它是在递归开始之前调用函数的变量的引用,因此,它是相同的副本。

通过将指针传递给变量来执行您正在执行的功能会更好,您可以更好地控制后续的递归实例。

答案 2 :(得分:4)

您的理解相当准确。

static表示该变量有一个版本。每次调用包含static变量的函数时,变量都会为其分配最后一个值。全局变量也可以标记为static,这意味着它的范围仅限于该文件。

调用函数时,其局部变量放在调用堆栈上。为每个函数调用推送此堆栈,然后在每个函数存在时弹出。递归调用只是将同一函数的新副本推送到堆栈上。