1.内存分区:
高(内存地址大) 栈底 栈区
堆区
静态区
常量区
低(内存地址小) 代码区
2.栈:数据结构
(1)特点:先进后出
(2)操作:入栈(push)出栈(pop)
(3)栈从高->低分配空间
char a = 0;
char b = 0;
char c = 0;
printf(“a:%p\n”,&a);
printf(“b:%p\n”,&b);
printf(“c:%p\n”,&c);
(4)栈从低->高使用
char n1 = 1;
char n2 = 0;
short *p = &n2;
printf(“%d\n”,*p);
(5)函数:每一个函数,系统都会分配栈
int fun1(){
int n1 = 200;
return n1;
}
int fun2(){
int n1;
return n1;
}
int main(){
fun1();
int m = fun2();
printf(“%d\n”,m);
}
主函数分配栈后,执行到fun1,再分配栈,该函数执行完毕后,标记n1被删除,但是数据被保留;执行到fun2,有标记相同,获得上一个栈保留的数据;然后,m拷贝数据,输出m=200.
(6)等号由右向左执行
(7)标记删除(不删除数据)
(8)内存机制:数据不会清除,只是覆盖
(9)注意:写变量要赋初值
(10)系统分配以及回收内存
(11)函数体内创建的变量分配在栈区
int a = 10;//a存放在内存的栈区(当出了花括号则系统回收)
3.堆区
(1)动态内存分配,
(2)关键字malloc ,释放内存free();
(3)由用户(程序员)分配和回收,如果程序员未回收内存,那么内存就会越用越少,有可能导致内存不够用,程序崩溃。如果没有达到不够用,程序安然无恙。
(4)当程序退出时,堆内存由系统回收(关键字free)
4.静态区(全局区)
(1)定义在函数体外面的变量,由系统开辟空间,程序运行过程一直都在,直到程序退出,由系统回收。
(2)变量不定义在任何函数体内
int x = 8;//x存放在静态区
int main(){
};
(3)特点:①只初始化一次②如果初始化时未赋初值,默认值为0③静态变量的空间只有程序退出才释放(程序运行期间永远存在)
(4)目的:①延长变量生命周期②不增大该变量的作用域
(5)关键字:static
for(int i = 0 ; i < 5 ; i ++){
// int m = 0;
static int m = 0;//判断在静态区是否存在变量,结果等同于将int m = 0放在for循环外面
printf(“%d\n”,m++);
}
5.常量区
(1)常量区的数据存储在常量区,常量区的内容不可更改
(2)浮点数,整型数,字符数
int a = 10;//10存在常量区
6.代码区
(1)存放源代码的编译区。所有写的代码,函数编译成二进制放在代码区
(2)所有的语句编译后生成的CPU指令存储在代码区