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

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

  在C语言中,具体的存储类别有自动(auto)、寄存器(register)、静态(static)及外部(extern)四种。静态存储类别与外部存储类别变量存放在静态存储区,自动存储类别变量存放在动态存储区,寄存器存储类别直接送寄存器。

  变量存储类别定义方法:

  存储类别类型变量表;

  例如:

  (1)a,b,c为整型自动存储类别变量:

  auto int a,b,c;

  (2)x,y,z为双精度型静态存储类别变量:  

  static double x,y,z;

  1、变量有哪些存储类型?

  变量的存储类型由“存储类型指明符”来说明。存储类型指明符可以是下列类键字之一:

  auto
  register
  extern
  static

  下面是详细的解释:

  auto 存储类指明符--用于说明具有局部作用域的变量,它表示变量具有局部(自动)生成期,但由于它是所有局部作用域变量说明的缺省存储类指明符,所以使用得很 少。要注意的是,所有在函数内部定义的变量都是局部变量,函数内部定义的变量其作用域只在函数内部。它的生存期为该函数运行期间,一旦离开这个函数或这个 函数终止,局部变量也随之消失。

  register 存储类指明符--当声明了这个指明符后,编译程序将尽可能地为该变量分配CPU内部的寄存器作为变量的存储单元,以加快运行速度。注意,寄存器与存储器是 不同的。寄存器一般在CPU内部,而存储器一般指外部的(比如内存条),CPU内部的寄存器其运算速度是很高的。当寄存器已分配完毕,就自动地分配一个外 部的内存。它的作用等价于auto,也只能用于局部变量和函数的参量说明。

  static 存储类指明符--表示变量具有静态生成期。static变量的的特点是它离开了其作用域后,其值不会消失。

  当回到该作用域之后又可以继续使用这个static变量的值。

  例:利用static变量统计调用函数的次数


int two(); /*函数原型说明*/ 
void main() 
{ 
int a=0; 
a=two(); /*a的值等于1*/ 
a=two() /*a的值等于2*/ 
a=two(); /*a的值等于3*/ 
}

int two() 
{ 
static int b=0;    /*定义了一个局部的static变量*/ 
b ; 
return b; 
}

  如果不是一个static变量就不会有这个效果了


int two(); /*函数原型说明*/ 
void main() 
{ 
int a=0; 
a=two(); /*a的值等于1*/ 
a=two() /*a的值等于1*/ 
a=two(); /*a的值等于1*/ 
}

int two() 
{ 
int b=0;     
b ; 
return b; 
} 

  变量a的值总是1,原因是在函数two()中,变量b不是一个static变量,其值随着离开two函数就消失了,当回到two函数时又被重新赋值0。