C语言-基础入门-学习笔记(17):存储类、作用域、生命周期、链接属性的总结

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的)都是无连接的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值