内存四区的作用以及static修饰变量
c程序在执行时,将内存大致分为四个区域,分别是
(1)代码区:存放函数体的二进制代码,由操作系统进行管理。
(2)全局区,存放全局变量和静态变量,以及常量。
(3)栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。
(4)堆区:由程序员分配和释放,若程序员不释放,则程序结束时由操作系统回收。
内存四区的意义:不同区域存放的数据,赋予不同的生命周期,方便灵活编程。
以下详解四个区域:
程序运行前: 在程序编译之后,生成exe可执行程序,未执行程序之前,该程序分为两个区:
代码区:存放cpu执行的机器指令,有两个性质:
(1)代码区是共享的,对于频繁执行的程序,只需要在内存中有一份代码即可。
(2)代码区是只读的,这是为了防止程序意外地修改它的指令。
全局区:全局区的数据会在程序结束之后由操作系统来释放,存放以下数据:
全局变量:定义在函数体之外的变量,作用域为整个程序,生命周期直到程序结束。
静态变量:由static修饰的静态全局变量,以及由static修饰的局部变量都称为静态局部变量。 static修饰的静态局部变量其作用域保持不变(不能在其它地方使用),但生命周期直至程序结束。 static修饰的静态全局变量生命周期仍然是直到程序结束,但它的作用域与全局变量有所区别,静态全局变量只能在自己的源文件内使用,也就是说其作用域变小了,而全局量是可以在其它源文件内使用的。 (需要注意的是,由static修饰的变量,其赋初值语句只执行一次,当再次碰到时会跳过赋初值语句。倘若static修饰的变量不赋初值,则会默认赋初值0(数值型变量),或'\0'(字符型变量)。static修饰的函数只能在自己的源文件里使用,而在其它源文件内是不见的。)
常量与字符串常量:存在全局区
由const修饰的全局变量:存在全局区
在程序运行时,程序还会使用到栈区以及堆区:
栈区:由编译器自动释放,存放函数的参数值,局部变量等。 注意事项:不要返回局部变量的地址,因为栈区开辟的数据会由编译器自动释放。
堆区:是由程序员申请使用的空间。通过new关键字来申请空间,使用过后通过delete关键字来释放。倘若程序元不释放,则程序结束过后由操作系统自动释放。