作用域
- 变量起作用的范围
变量
- 局部变量:再{}范围之内定义的变量
- auto int a;
- 静态局部变量:再{}范围之内定义的变量,前面加上static修饰变量
- static int a;
- 全局变量:再函数之外定义的变量
- 静态全局变量:再函数之外定义的变量,加上static修饰的变量
生命周期
什么时候开辟空间(出生),释放空间(死亡),这个过程叫生命周期
局部变量
- 作用域 :在定义变量的{}之内有效
- 生命周期:程序运行至变量定义处开辟空间,所在的函数结束之后释放空间
- 未初始化的值:随机
静态局部变量
- 作用域:在定义变量的{}之内有效
- 生命周期:执行main函数之前就已经开辟空间,程序结束之后才释放空间
- 未初始化的值:0
全局变量
- 作用域:整个工程,所有文件
- 生命周期:执行main函数之前就已经开辟空间,程序结束之后才释放空间
- 未初始化的值:0
静态全局变量
- 作用域:当前文件
- 生命周期:执行main函数之前就已经开辟空间,程序结束之后才释放空间
- 未初始化的值:0
变量小节
- 作用域:局部变量(普通局部和静态局部)在{}范围之内,普通全局作用于整个工程,静态全局作用域当前文件
- 生命周期:只有普通局部是运行至变量定义处时开辟,函数结束释放,其他变量都是执行main函数之前就已经开辟空间,在程序结束之后才释放空间
- 初始化的值:只有普通局部变量未初始化的值为随机值,其他为0
注意:在.h中,全局变量只声名不定义,定义放在.c文件中
变量的重命名问题
- 考虑作用域前提下,就近原则
1 |
|
静态函数
- 静态函数就是在函数定义时加上static修饰的函数,静态函数只可以被当前文件函数调用
- static void fun (){}
- 普通的函数没有加任何修饰,就是全局函数,整个工程可以调用
程序内存分布
静态全局
- 普通静态局部变量,全局变量,静态全局变量
内存从上到下分布
- 栈区:存放局部普通变量
- 堆区:使用时需要申请malloc
- 静态全局区:分为未初始化的静态全局(bss)和初始化的静态全局(data)
- 文字常量区
- 代码区
1 |
|
以上代码的内存分布
- 栈区:a, b i , k
- 静态全局区(未初始化):e , f , c
- 静态全局区(已初始化):g, h ,d
- 文字常量区:”test”
memset
1 |
|
代码实列
1 | include<stdio.h> |
memcpy内存拷贝
1 |
|
代码示例一
1 | int main() |
代码示例二
1 |
|
memcmp
1 |
|
代码示例
1 |
|
- 总之:内存操作函数遇到\0和0都不会结束操作,而str字符函数都会结束
malloc 向堆区申请空间
1 |
|
free
1 |
|
注意:free指定释放一次上次申请的空间
free 参数 地址必须是上一次malloc申请过的,不能改变这个地址
1 |
|
测试代码
1 |
|