内存管理——内存布局
代码区、常量区、静态区(全局区)、堆区、栈区
const 关键字详解
底层内存分布
代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的;
常量区:存放常量(程序在运行时不能被改变的量),例如:10,字符串常量:“abcd”;数组名;
静态区(全局区):静态变量和全局变量的存储区域是一起的;一旦静态区的内存被分配,静态区的内存直到程序结束之后才会被释放;
堆区:由程序员调用**malloc()**函数来主动申请的,需使用free()函数来释放内存,若申请的堆区内存,之后忘记释放,就会造成内存泄漏问题;
栈区:存放函数的局部变量、形参和函数返回值,栈区之中的数据作用范围过了之后,系统就会自动回收内存。
在栈上创建数组时,不能使用含有变量的表达式,如:int a[x+2]是错误的。
在栈上创建的数组,编译时就需要在栈上分配内存,可是有了变量以后,编译器就无法知道分配多大的内存了,编译器就会报错。
在堆上可以动态创建数组,因为在堆上创建数组时,编译器不会做编译时分配内存,而是在程序运行时分配内存,我们可以知道,程序运行时变量的值就会明确还多少,故动态创建数组时就可以出现变量。
static关键字
(1)用于修饰局部变量,全局变量和函数;
(2)存放在静态区;
(3)定义时没有初始化时,会将其初始化为0;
(4)修饰局部变量时,函数返回时,值不变
(5)修饰全局变量和函数时,只在当前文件可见,降低程序模块之间的耦合性。
const关键字
(1)被修饰的变量不可被修改;
(2)存放在常量区;
(3)const修饰的普通变量:定义时就是赋初值,后面就不能被修改了;
(4)const修饰的全局变量存放在常量区,也不可修改。
(5)const修饰的变量并不会存放在全局(静态)区,而是取决于他定义的地方,局部定义就是在栈区,全局定义就是在静态区。
static和const区别
static修饰的变量称为静态变量,存储在全局(静态)区,生命周期程序编译到运行结束;
const修饰的变量并不会存放在全局(静态)区,而是取决于它定义的地方,局部定义的就存在栈区,全局定义的就存放在静态区。
const修饰的变量不能被修改,为什么不放在只读数据区呢,是因为C语言中使用const修饰了一个变量,该变量不能直接修改,但是可以通过拿到这个变量的地址来修改这个变量。
但是如果修饰的字符串常量,那就无论如何也修改不了的。