# 存储类型

auto, static, extern, register

auto 和 register 只在块作用域中使用,register 寄存器变量只是对编译器的建议
静态局部变量只初始化一次
全局变量默认外部链接,被 extern 声明可以被其他文件访问
static 声明的全局变量为内部链接,只能被当前文件访问

  • 同名全局变量会发生冲突,但是同一个文件中会提示,不同文件中不提示
    未初始化的全局变量为弱符号,编译时存放在 common 块,链接时再放到 bss 段。
    如果两个都初始化为 0 了,那么就是强符号,就会提示。
    static 修饰的话不会冲突,支持同名

  • 在头文件中定义全局变量可能会产生单个定义或多个定义,除非每个包含头文件的.c 文件都需要一个 static 才可以

未初始化或初始化为 0 的全局变量都在 bss 段中,但有弱符号和强符号的区别

  • 多文件共享的声明放在头文件中作统一的声明,遵循 “声明与定义分离” 的原则
    在.h 中声明 extern,在唯一.c 中定义和内存分配
  • 全局变量建议封装接口不建议 extern
    将全局变量用 static 关键字限制在当前源文件内(使其具有内部链接性,对外不可见),然后提供专门的函数(接口)来读取或修改它

# 数组

# 相减

1
2
int a[] = {0, 1, 2, 3, 4};
printf("%u\n", &a[1] - &a[0]); // 输出 1 为步长
1
2
3
4
int a[5] = {0, 1, 2, 3, 4};
uintptr_t a0 = (uintptr_t)a;
uintptr_t a1 = (uintptr_t)(a + 1);
printf("%u\n", a1 - a0); // 输出 4 为字节数

# 变长数组和动态数组

  • 变长数组
1
2
int n;
int a[n];
  • 动态数组
    经常用在 tlv 类型中
    0 长度数组,用于结构体的最后一个元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct {
int t;
int l;
int v[0]; //指向l后面的内存,但不体现在结构体的内存中
} Msg;

int TesDymanicArray(void) {
Msg *msg = malloc(sizeof(Msg) + 2 * sizeof(int));
msg->t = 0;
msg->l = 2;
msg->v[0] = 1;
msg->v[1] = 0;
free(msg);
return 0;
}

在 c99 后的版本直接写 v[] 就可以(灵活数组)

# 字符串

Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

NoResponse WeChat Pay

WeChat Pay

NoResponse Alipay

Alipay

NoResponse PayPal

PayPal