C语言-基础入门-学习笔记(17):存储类、作用域、生命周期、链接属性的总结
一、总表
变量类型 | 存储类 | 作用域 | 生命周期 | 链接属性 |
---|---|---|---|---|
局部变量 | 栈 | 所在代码块 | 函数结束 | 无链接 |
static局部变量(为0) | bss段 | 所在代码块 | 程序结束 | 无链接 |
static局部变量(赋值) | 数据段 | 所在代码块 | 程序结束 | 无链接 |
全局变量(为0) | bss段 | 所在文件 | 程序结束 | 外链接 |
static全局变量(为0) | bss段 | 所在文件 | 程序结束 | 内链接 |
static局部变量(赋值) | 数据段 | 所在文件 | 程序结束 | 内链接 |
函数 | 代码段 | 所在代码块 | 程序结束 | 外链接 |
static函数 | 代码段 | 所在代码块 | 程序结束 | 内链接 |
字符串 | 代码段 | – | – | 内链接 |
const修饰的变量 | 代码段 | 所在代码块 | 函数结束 | 内链接 |
堆变量 | 堆 | – | malloc开始free结束 | 无链接 |
二、存储类、作用域、生命周期、链接属性
1. 存储类
存储类就是存储类型,也就是描述C语言变量在何种地方存储。
内存有多种管理方法:栈、堆、数据段、bss段、.text段······一个变量的存储类属性就是描述这个变量存储在何种内存段中。
(1)代码段(或叫文本段 (.text))
该部分内存储着程序的代码(函数),const修饰的常量保存在此部分,字符串也保存在此段。
(2)数据段
1、显式初始化为非0的全局变量;2、显式初始化为非0的static局部变量。
(3)bss段
1、显式初始化为0或者未显式初始化的全局变量;2、显式初始化为0或未显式初始化的static局部变量。
(4)堆
通过堆内存申请到的空间内保存的内容。
(5)栈
非static的局部变量分配在栈上。
2. 作用域
作用域是描述这个变量起作用的代码范围。
所以一个变量的作用域是:这个变量定义所在的{}范围内从这个变量定义开始往后的部分。
(1)局部变量
局部变量的作用域是代码块作用域,也就是说一个局部变量可以被访问和使用的范围仅限于定义这个局部变量的代码块中定义式之后的部分。
(2)全局变量
函数和全局变量的作用域是定义所在的整个.c文件之内定义式之后的部分。
3. 生命周期
声明周期是描述这个变量什么时候诞生(运行时分配内存空间给这个变量)及什么时候死亡(运行时收回这个内存空间,此后再不能访问这个内存地址,或者访问这个内存地址已经和这个变量无关了)的。
(1)栈变量
局部变量(栈变量)存储在栈上,生命周期是临时的,该变量所在函数结束则消亡。
(2)堆变量
从malloc开始,到free结束。
(3)数据段、bss段变量
全局变量的生命周期是永久的,整个程序结束后才会消亡。
(4)代码段、只读段
其实就是程序执行的代码,其实就是函数,它的生命周期是永久的。
4. 链接属性
.o的目标文件链接生成最终可执行程序的时候,其实就是把符号和相对应的段给链接起来。
C语言中的符号有三种链接属性:外连接属性、内链接属性、无连接属性。
编译以文件为单位、链接以工程为单位。
(1)外链接
外连接的意思就是外部链接属性,也就是说这家伙可以在整个程序范围内(言下之意就是可以跨文件)进行链接,譬如普通的函数和全局变量属于外连接。
(2)内链接
内链接的意思就是(c文件内部)内部链接属性,也就是说这家伙可以在当前c文件内部范围内进行链接(言下之意就是不能在当前c文件外面的其他c文件中进行访问、链接)。static修饰的函数/全局变量属于内链接。
(3)无链接
无连接的意思就是这个符号本身不参与链接,它跟链接没关系。所有的局部变量(auto的、static的)都是无连接的。