一在c中分为这几个存储区
1.栈 - 由编译器自动分配释放
2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
4.存储常量的地方。- 程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,函数中的"adgfdf"这样的字符串存放在常量区。
二变量的存储类别:
变量从作用域(空间)角度可以分为全局变量和局部变量。
而从生存期(时间)角度可以分为静态存储方式和动态存储方式
具体包括:
a) 自动的(auto)
b) 静态的(static)
c) 寄存器的(register)
d) 外部的(extern)
静态存储方式:程序运行期间由系统分配固定的存储空间的方式
动态存储方式:程序运行期间根据需要进行动态的分配存储空间方式
内存中供用户使用的存储空间:
1. 程序区
2. 静态存储区
3. 动态存储区
数据存放在后两个存储区中,
全局变量存放在静态存储区中
函数形式参数(调用时)和局部变量(未加static修饰)存放在动态存储区中,在函数调用完后会被系统自动清空。
下面我只介绍前两个:
1) Auto:
变量如果不加static修饰变量,则都是动态的分配存储空间,系统根据需要进行分配和释放数据所占用的存储空间
2) Static:
当我们希望局部变量在函数调用完后不被自动的清空而是保留生成的值(即它所占用的存储单元不被释放),这时static的作用就可以在这里的到体现了;
Static修饰全局变量时,改变量的作用域只限于本文件
用static修饰的变量,若不就此赋值时,编译时自动赋值0(数值int型)or 空字符(char型)
Static的劣势:
多占内存(长时间占用内存不释放);降低程序的连续性 ,多次调用后,不能明确变量的值