C的变量有四种存储的方式,全局变量,局部变量,静态全局,静态局部。
按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区
按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量在整个工程文件有效,局部只在所在域有效。静态全局变量只在定义它的文件内有效。
静态全局变量只在他的文件内有效。静态局部变量只在他的函数内有效,程序仅分配一次内存,函数返回后,变量并不消失。局部变量返回后消失!
这个影响到函数返回,局部变量参数。最好不要返回局部变量,即使返回也应该static。
自动变量(auto)----生存期:定义该变量的函数被调用时才给它分配存储单元,开始它的生存期,函数调用结束,释放存储单元,结束生存期;作用域:定义它的函数或复合语句内。注,系统不会为其进行默认的初使化赋值值。
寄存器变量(register)----寄存器变量是局部变量,使用动态存储方式,只有 局部自动变量和形式参数才可以作为寄存器变量。
外部变量----也称全局变量。具有全局作用域,只需在一个源文件中定义,就可以作用于所有的源文件,当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。
静态变量 ----静态局部变量:在函数内定义,但当函数退出后,静态局部变量始终还存在,其占用的内存单元不会被人释放,只有当程序结束时,才会随全局变量一起释放。 生存期 :整个源程序(从变量定义开始到程序结束)。 作用域 :定义该变量的函数内。退出该函数后,尽管该变量还存在,但不能使用它。如果再次调用定义它的函数时,它又可继续使用,而且保存了前次被人调用后留下的值;静态全局变量:只能在其所在文件模块中的函数中使用。其他文件模块中的函数将不能访问。
内存区域的划分:
- 栈区:由编译器自动分配和释放的内存区域,用于存放函数的参数值,局部变量的值等。随着函数的调用和返回,栈区的数据将动态变化。
- 堆区:程序员向系统申请或释放。若程序员在程序结束时还没有释放,则可能由操作系统回收。malloc.
- 全局区:用来保存全局变量和静态变量。在进入程序时分配区域,程序结束后由系统释放。
- 文字常量区:用于保存常量字符串的内存区域,程序结束后,由系统释放。
- 程序代码区:用于保存函数体的二进制代码。