C/C++ 中堆和栈及静态数据区详解

2020-01-06 17:17:33王振洲

  自动存储类型修饰符指定了一个局部变量为自动的,这意味着,每次执行到定义该变量的语句块时,都将会为该变量在内存中产生一个新的拷贝,并对其进行初始化。实际上,如果不特别指明,局部变量的存储类型就默认为自动的,因此,加不加auto都可以。


main()
 {
   auto int num=5;
   printf("%dn",num);
 }

  在这个例子中,不论变量num的声明是否包含关键字auto,代码的执行效果都是一样的。函数的形式参数存储类型默认也是自动的。        

      2.静态存储变量

  前面已经使用了static关键字,但是对于局部变量,静态存储类型的意义是不一样的,这时,它是和自动存储类型相对而言的。静态局部变量的作用域仍然近 局限于声明它的语句块中,但是在语句块执行期间,变量将始终保持它的值。而且,初始化值只在语句块第一次执行是起作用。在随后的运行过程中,变量将保持语 句块上一次执行时的值。

  看下面两个对应的程序:


    /*1.C*/        /*2.C*/
   int add();        int add();

   main()         main()
   {          {
    int result;       int result;
    result=add()       result=add();
    printf("%d ",result);     printf("%d ",result);
    result=add();       result=add();
    printf("%d ",result);     printf("%d ",result);
    result=add();       result=add();
    printf("%d",result);     printf("%d",result);
   }          }

   int add()        int add()
   {          {
    int num=50;       static int num=50;
    num++;         num++;
    return num;       return num;
   }          }

  上面两个源文件,只有函数add()里的变量声明有所不同,一个是自动存储类型,一个是静态存储类型。

  对于1.C文件,输出结果为51 51 51;这很好理解,每次初始值都是50,然后加1上来。

  对于2.C文件,输出结果为51 52 53;这是由于变量是静态的,只在第一次初始化了50,以后都是使用上次的结果值。当第一次调用add()时,初始化为50,然后加1,输出为51;当第 二次调用时,就不初始化了,这时num的值为上次的51,然后加1,输出52;当第三次调用时,num为52,加1就是53了。

  比较就会发现它们的不同之处了。静态变量在下一节要说的递归函数中经常使用到。

  当第一次不指明静态变量的初始值时,默认为0。

  下面举一个例子,把我们说到的静态变量理解一下。

  求1+2+……+100的值的代码如下:


      void add();
   int result;

   main()
   {
    int i;
    result=0;
    for(i=0;i<100;i++) add();
    printf("%dn",result);
   }

   void add()
   {
    static int num=0;
    num++;
    result+=num;
   }