堆和堆栈段

时间:2014-02-26 20:42:27

标签: c for-loop static stack heap

我遇到了一个小谜题,我试图找到输出。一旦我设法得到输出,我调整了1行,输出完全不同。为什么以下两个程序的输出会有所不同?:

A)

#include<stdio.h>
int fun()
{
  static int num = 40;
  return num--;
}

int main()
{
  for(fun(); fun(); fun())
  {
    printf("%d ", fun());
  }
  getchar();
  return 0;
}

输出:

38 35 32 29 26 23 20 17 14 11 8 5 2

b)

#include<stdio.h>
int fun()
{
  static int num;
  num  = 40;
  return num--;
}

int main()
{
  for(fun(); fun(); fun())
  {
    printf("%d ", fun());
  }
  getchar();
  return 0;
}

输出:每次无限循环打印40

只有一个区别:声明和初始化在(a)中同时完成,但在(b)中分别完成。这对最终结果有何影响?

4 个答案:

答案 0 :(得分:3)

static int num = 40;

static int num;

这两个都得到一次评估。 num不在运行时堆栈上(而是在数据段中)然后,

num = 40;
每次拨打fun()时都会评估

。你将一个在堆栈外声明的变量重新分配给40,导致它永远循环。

答案 1 :(得分:2)

在第一个中,num仅在第一次调用函数时初始化为40。在第二个中,每次调用函数时都会将其设置为40

答案 2 :(得分:1)

第一个,num被初始化一次,无论你调用函数多少次

第二个,每次调用函数时,num都设置为40

答案 3 :(得分:0)

这里需要考虑两个概念

  1. 变量的生命周期
  2. 变量范围
  3. 变量的生命周期是它存在的时间段。如果在没有关键字static的情况下定义num,则生命周期将从fun()到fun()返回;所以每次通话都会重新初始化为40。

    变量的范围是可以看到变量名称的位置。这里,num只在函数fun()中可见。

    关键字static用于将变量的生命周期延长到程序的生命周期。在静态声明的情况下,初始化只发生一次,然后变量在例程fun()中保留其值。因此,如果您通过在第二种情况下将其设置为值40来覆盖它,则在每次调用fun()时它的值都会设置为40。在第二个代码中,将变量num声明为static是多余的。