# 存储类型
auto, static, extern, register
auto 和 register 只在块作用域中使用,register 寄存器变量只是对编译器的建议
静态局部变量只初始化一次
全局变量默认外部链接,被 extern 声明可以被其他文件访问
static 声明的全局变量为内部链接,只能被当前文件访问
-
同名全局变量会发生冲突,但是同一个文件中会提示,不同文件中不提示
未初始化的全局变量为弱符号,编译时存放在common块,链接时再放到bss段。
如果两个都初始化为 0 了,那么就是强符号,就会提示。
static 修饰的话不会冲突,支持同名 -
在头文件中定义全局变量可能会产生单个定义或多个定义,除非每个包含头文件的.c 文件都需要一个 static 才可以
未初始化或初始化为 0 的全局变量都在 bss 段中,但有弱符号和强符号的区别
- 多文件共享的声明放在头文件中作统一的声明,遵循 “声明与定义分离” 的原则
在.h 中声明 extern,在唯一.c 中定义和内存分配 - 全局变量建议封装接口不建议 extern
将全局变量用 static 关键字限制在当前源文件内(使其具有内部链接性,对外不可见),然后提供专门的函数(接口)来读取或修改它
# 数组
# 相减
1 | int a[] = {0, 1, 2, 3, 4}; |
1 | int a[5] = {0, 1, 2, 3, 4}; |
# 变长数组和动态数组
- 变长数组
1 | int n; |
- 动态数组
经常用在tlv类型中
0 长度数组,用于结构体的最后一个元素
1 | typedef struct { |
在 c99 后的版本直接写 v[] 就可以(灵活数组)