background image

C 语言常见问题解答之变量和数据存储

    C 语言的强大功能之一是可以灵活地定义数据的存储方式。C 语言从两个方
面控制变量的性质:作用域(scope)和生存期(lifetime)。作用域是指可以存取
变量的代码范围,生存期是指可以存取变量的时间范围。
    作用域有三种:
    1. extern(外部的)  这是在函数外部定义的变量的缺省存储方式。extern 变
量的作用域是整个程序。
    2.static(静态的)  在函数外部说明为 static 的变量的作用域为从定义点
到该文件尾部;在函数内部说明为 static 的变量的作用域为从定义点到该局
部程序块尾部。
    3.auto(自动的)  这是在函数内部说明的变量的缺省存储方式。auto 变量
的作用域为从定义点到该局部程序块尾部。
    变量的生存期也有三种,但它们不象作用域那样有预定义的关键字名称。第
一种是 extern 和 static 变量的生存期,它从 main()函数被调用之前开始,
到程序退出时为止。第二种是函数参数和 auto 变量的生存期,它从函数调用
时开始,到函数返回时为止。第三种是动态分配的数据的生存期,它从程序调
用 malloc()或 calloc()为数据分配存储空间时开始,到程序调用 free()或程序
退出时为止。

    

2.1  变量存储在内存(memory)中的什么地方?

    变量可以存储在内存中的不同地方,这依赖于它们的生存期。在函数外部定
义的变量(全局变量或静态外部变量)和在函数内部定义的 static 变量,其生存
期就是程序运行的全过程,这些变量被存储在数据段(datasegment)中。数据
段是在内存中为这些变量留出的一段大小固定的空间,它分为两部分,一部
分用来存放初始化变量,另一部分用来存放未初始化变量。
    在函数内部定义的 auto 变量(没有用关键字 static 定义的变量)的生存期从
程序开始执行其所在的程序块代码时开始,到程序离开该程序块时为止。作为
函数参数的变量只在调用该函数期间存在。这些变量被存储在栈(stack)中。栈
是内存中的一段空间,开始很小,以后逐渐自动增大,直到达到某个预定义
的界限。在象 DOS 这样的没有虚拟内存(virtual memory)的系统中,这个界
限由系统决定,并且通常非常大,因此程序员不必担心用尽栈空间。关于虚拟

 

内存 的讨论,请参见 2.3。    
    第三种(也是最后一种)内存空间实际上并不存储变量,但是可以用来存储
变量所指向的数据。如果把调用 malloc()函数的结果赋给一个指针变量,那么

这个指针变量将包含一块动态分配的内存的地址,这块内存位于一段名为 堆
(heap)”的内存空间中。堆开始时也很小,但当程序员调用 malloc()或
calloc()等内存分配函数时它就会增大。堆可以和数据段或栈共用一个内存段
(memorysegment),也可以有它自己的内存段,这完全取决于编译选项和
操作系统。
  与栈相似,堆也有一个增长界限,并且决定这个界限的规则与栈相同。

   请参见:
    1.1  什么是局部程序块(10calblock)?