C 语言的变量的作用域和生存期 一、c 程序存储空间布局 C 程序一直由下列部分组成: 1) 正文段——CPU 执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3)非初始化数据段(bss 段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。 5)堆——动态存储分。 |-----------| | | |-----------| | 栈 | |-----------| | | | | /|/ | | | | | | /|/ | | | | |-----------| | 堆 | |-----------| | 未初始化 | |-----------| | 初始化 | |-----------| | 正文段 | |-----------| 二、 面向过程程序设计中的static 1. 全局静态变量 在全局变量之前加上关键字static, 全局变量就被定义成为一个全局静态变量。 1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在) 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) 3) 作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。 看下面关于作用域的程序: //teststatic1.c void display(); extern int n; int main() { n = 20; printf("%d/n",n); display(); return 0; } //teststatic2.c static int n; //定义全局静态变量,自动初始化为0,仅在本文件中可见 void display() { n++; printf("%d/n",n); } 文件分别编译通过,但link 的时候teststatic1.c 中的变量n 找不到定义,产生错误。 定义全局静态变量的好处: <1>不会被其他文件所访问,修改 <2>其他文件中可以使用相同名字的变量,不会发生冲突。 2. 局部静态变量 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。 1)内存中的位置:静态存储区 2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) 3) 作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。 注:当static 用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局...