您的位置:首页 > 其它

C语句基础学习(八)——内存管理(总结于创智播客讲义)

2019-01-24 15:18 148 查看

八、内存管理

1、作用域

1.1、局部变量

  • C语言变量的作用域分为:
  • 代码块作用域(代码块是{}之间的一段代码)
  • 函数作用域
  • 文件作用域
  • 局部变量也叫auto 自动变量 auto可以不写,一般情况下代码块{}内部定义的变量都是自动变量
  • 特点如下 在一个函数内定义,只有函数范围内有效
  • 在符合语句中定义,只有符合语句中有效
  • 随着函数调用的结束或复合语句的结束局部变量的声明生命周期也结束
  • 如果没有赋值,内容随机

1.2、静态static局部变量

  • static局部变量的作用域也是在定义的函数内有效
  • static局部变量的声明周期和程序运行周期一样,同时static局部变量的值只初始化一次,但可以赋值多次。
  • static 局部变量若未赋值,则由系统自动赋值,数组型变量自动初始值0,字符型赋值空字符。

1.3、全局变量

  • 在函数外定义,可被本文件及其他文件中的函数所共用,若其他文件中的函数调用次变量,必须extern声明
  • 全局变量的声明周期和程序运行周期一样
  • 不同文件的全局变量不可重名

1.4、静态static全局变量

  • 在函数外定义,作用范围被限制在所定义的文件中
  • 不同文件静态全局变量可以重名,但作用域不冲突
  • static全局变量的声明周期和程序运行周期一样,同时static全局变量的值只初始化一次

1.5、extern全局变量声明

  • extern int a;声明一个变量,这个全局变量在别的文件中已经定义了,这里只是声明,而不是定义。

1.6、全局函数和静态函数

  • 在C语言中函数默认都是全局的,使用关键字static可以将函数声明为静态,函数定义为static就意味着这个函数只能在定义这个函数的文件中使用,在其他文件中不能调用,即使在其他文件中声明这个函数都没用。
  • 对不同文件中的stati函数的名字可以相同

1.7、总结

类型 作用域 生命周期
auto变量 一对{}内 当前函数
static局部变量 一对{}内 整个程序运行期
extern变量 整个程序 整个程序运行期
static全局变量 当前文件 整个程序运行期
extern函数 整个程序 整个程序运行期
static函数 当前文件 整个程序运行期
register变量 一对{}内 当前函数
全局变量 整个程序 整个程序运行期

2、内存分布

2.1、内存分配

  • C代码进过预处理,编译,汇编、链接4步生成一个可执行程序
  • 程序没有加载到内存前,可执行程序内部已经分好3段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分(有些人直接把data和bss合起来叫做静态区或全局区)。
  • 代码块:存放CPU执行的机器指令,通常代码是可以共享的(即另外的执行程序可以调用它)使其可共享的目的是对于频繁被执行的程序,只需要在内存中一份代码即可,代码区通常是只读的,使其只读的原因是防止程序以外地修改了它的指令,另外,代码区还规划了局部变量的相关信息
  • 全部变量初始化数据区/静态变量(data段) 该区包含了再程序中明确被初始化的全局变量、已经初始化的静态变量(包含全局变量静态变量和局部静态变量)和常量数据(如字符串常量)
  • **为初始化数据区(又叫bss区)**存入的是全局未初始化变量和为初始化静态变量,未初始化数据区在程序开始执行之前被内核初始化为0;或者为空(NULL)
  • 程序在加载到内存前,代码区和全局区(data和bss)的大小就是固定的,程序运行期间不能改变。然后,运行可执行程序,系统把程序加载到内存,除了根据可执行程序的信息分出代码区(text)、数据区(data)和未初始化数据区(bss)之外,还额外增加了栈区、堆区。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: