一、典型的C程序存储空间布局 

C程序一直由下列5部分组成:

1、正文段:CPU执行的机器指令部分,也就是主要的程序代码编译出来的结果;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令,通常可以共享。

2、初始化数据段:通常称之为数据段,包含了程序中明确赋值的变量。譬如一些初始化的全局变量等,如int a = 10,变量名和值都存放在这个段中。

3、未初始化数据段:通常称之为BBS(Block Started by Symbol)段,包含了程序中没有进行赋值的变量,譬如一些未初始化的全局变量。如int a,在程序执行前,内核会把这部分全部置为0(NULL)。

4、:自动变量以及每次函数调用时所保存的信息放在此段中。如函数调用时要保存返回地址等。栈是从上向下分配的。

5、:通常在堆中进行动态存储分配。如malloc, calloc, realloc等都从这里面分配。堆是从下向上分配的。

C程序存储空间布局及变量类型比较_存储

 

二 static法则:

 

A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;

B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;

C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(可重入:只要输入数据相同就应产生相同的输出);

 

全局变量有外部、静态两种存储方式。

(1)全局变量一般用外部存储方式存储,用保留字extern加以定义。此时,变量的作用域是构成整个程序的所有程序文件,也就是定义的外部变量可供其它程序文件使用。

使用这样的全局变量一定要非常慎重,一旦产生错误,将波及整个程序。

(2)如果希望全局变量仅限于本程序文件使用,而其它程序文件中不能引用,这时必须将其存储方式定义为静态存储方式,用保留字static加以定义。此时称为静态外部变量。

例如,在上例文件filel.c中,如果作这样的定义:

static int a:

则变量a的作用域被缩小至本程序文件filel.c,文件file2.c中不能引用。

值得注意的是对全局变量加static,定义为静态存储方式,并不意味着是静态存储;而不加static,是动态存储。两种形式的全局变量(外部变量)都是静态存储方式,都是编译时分配存储空间,但作用域不同。使用静态外部变量,有利于隔离错误,有利于模块化程序设计。

(3)全局变量的缺省存储方式是外部存储方式。

前面章节中的程序没有见到变量的存储类别定义,实际上采用变量的缺省存储方式。对局部变量采用auto方式,对全局变量采用extern方式。这也是至今为止,我们在程序中没有见到auto、extern等的原因。

至此,我们对变量的存储类别及数据类型进行了全面讨论,在此作个小结。

1.变量定义的一般形式

存储类别数据类型变量表;

2.变量定义的作用

①规定了变量的取值范围。

②规定了变量进行的运行操作。

③规定了变量的作用域。

④规定了变量的存储方式。

⑤规定了变量占用的存储空间。

3.局部变量和全局变量

从作用域角度将变量分为局部变量和全局变量。它们采取的存储类别如下:

局部变量:

①自动变量,即动态局部变量(离开函数,值就消失)。

②静态局部变量(离开函数,值仍保留)。

③寄存器变量(离开函数,值就消失)。

④形式参数可以定义为自动变量或寄存器变量。

全局变量:

①静态外部变量(只限本程序文件使用)。

②外部变量(即非静态的外部变量,允许其它程序文件引用)。

4.动态存储和静态存储

从变量存在时间可将变量存储分为动态存储和静态存储。静态存储是在整个程序运行时都存在,而动态存储则是在调用函数时临时分配存储单元。

动态存储:

①自动变量(函数内有效)。

②寄存器变量(函数内有效)。

③形式参数。

静态存储:

①静态局部变量(函数内有效)。

②静态外部变量(本程序文件内有效)。

③外部变量(整个程序可引用)。

5.静态存储区和动态存储区

从变量值存放的位置可将变量存储区分为静态存储区和动态存储区:

内存中静态存储区:

①静态局部变量。

②静态外部变量。

③外部变量(可被同一程序其它文件引用)。

内存中动态存储区:自动变量和形式参数。

CPU中的寄存器:寄存器变量。