在main之外的函数中定义的变量的生命

时间:2014-10-09 09:30:55

标签: c function variables static

这是用c

编写的代码
#include<stdio.h>

int foo()
{
    static int a=0;
    a=a+1;
    return a;
}

int main()
{
    foo();
    foo();
    printf("%d",foo());
}

我在 eclipse IDE 中使用 gcc11 编译了这段代码,我输出了3个。

这就是我认为应该发生的事情,它导致我输出为1而不是3。

函数调用-1: main函数调用函数foo和     控制转到函数foo然后foo中的变量'a'     使用初始值0创建,然后递增     一,此递增值(1)返回主函数。 在此步骤中,为函数foo创建的变量应该已被销毁。

函数调用-2:函数调用-1相同:

函数调用-3:函数调用-1相同:

最后,main中printf函数打印的值应为1。

为什么程序的输出是3?

4 个答案:

答案 0 :(得分:3)

函数返回时,

static变量不会被销毁。删除该关键字,它将按预期工作。

编辑: static变量仅出现在其自身函数的范围内。您可以在其他函数中创建具有相同名称(静态或其他)的其他变量。

void foo()
{
  static int a = 0;
  a++;
  printf("%d\n", a);
}

void bar()
{
  int a = 10;
  a++;
  printf("%d\n", a);
}

void baz()
{
  static int a = 100;
  a++;
  printf("%d\n", a);
}

int main()
{
  foo();
  bar();
  baz();

  foo();
  bar();
  baz();
  return 0
}

这将打印:

1
11
101
2
11
102

答案 1 :(得分:3)

尝试更多打印。

#include<stdio.h>

int foo()
{
    static int a=0;
    a=a+1;
    printf("a is now: %d",a);
    return a;
}

int main()
{
    foo();
    foo();
    printf("%d",foo());
}

您会注意到变量a只被初始化一次,并且它的值在函数调用调用中保留。

见这里:http://en.wikipedia.org/wiki/Static_variable

答案 2 :(得分:1)

这里,变量a是静态变量。
虽然变量的范围必须在完成函数执行后结束。但是静态变量在程序中具有范围,并且在整个程序中不会删除它们。

如果是

int a;

代替

static int a;

结果会有所不同。

答案 3 :(得分:1)

  • 函数内的静态变量在调用之间保持其值。

请参阅下面的示例,了解静态变量和普通变量之间的区别。

void sample()
{
    int nv = 10;//nv refers normal variable.
    static int sv  = 10;//sv refers static variable.
    nv += 5;
    sv += 5;
    printf("nv = %d, sv = %d\n", nv, sv);
}
int main()
{
    int i;
    for (i = 0; i < 5; ++i)
    sample();
}

<强>输出:

nv = 15, sv = 15
nv = 15, sv = 20
nv = 15, sv = 25
nv = 15, sv = 30
nv = 15, sv = 35