作用域
static
- 只初始化一次
- 如果没有初始化, 系统会自动赋0;
- static的生命周期和程序运行周期一样
- 不同文件静态全局变量可以重名
- static 定义全局变量, 只在当前文件有用, 外部不能使用
extern
- 若在A文件中使用在B文件中定义的全局变量, 必须要extern声明
- 不同文件的全局变量不可以重名
类型 | 作用域 | 生命周期 |
---|---|---|
auto | {} | 当前函数 |
static 局部变量 | {} | 整个程序运行期 |
extern | 整个城区 | 整个程序运行期 |
static 全局变量 | 当前文件 | 整个程序运行期 |
extern函数 | 整个程序 | 整个程序运行期 |
static函数 | 当前文件 | 整个程序运行期 |
register变量 | {} | 当前函数 |
内存布局
代码区 数据区 堆区 栈区
内存分区
程序没有加载到内存前, 分为3段: 代码区, 数据区, 未初始化数据区
代码区
- 存放CPU执行的机器指令.
- 只需在内存中存有一份代码
全局初始化数据区/静态数据区 (DATA)
该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)
未初始化数据区 (BSS)
存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为 0 或者空(NULL)
程序运行后多出两个区: 栈区, 堆区
栈区
- 向下增长
- 自动申请自动释放
假如内存地址从上往下变小
1234为数据
小端模式 1234向右转
大端模式 1234向左转
小端模式
高位字节放在高位地址, 低位字节放在低位地址
从左往右是字节高到低, 从上往下是地址高到低
大端模式
高位字节放在低位地址, 地址字节放在高位地址
堆区
- 向上增长
- 手动申请手动释放
内存操作函数
memset
将s的内存区域的前n个字节以参数c填入, 可以用来初始化
void *memset(void *s, int c, size_t n);
memcpy
dest和src不可重叠
拷贝src所指的内存内容的前n个字节到dest所值的内存地址上
void *memcpy(void *dest, const void *src, size_t n);
memmove
和memcpy操作一样, 可以处理重叠, 效率低
memcmp
比较s1和s2所指向内存区域的前n个字节
int memcmp(const void *s1, const void *s2, size_t n);
堆区分配和释放
malloc
void *malloc(size_t size);
free
void free(void *ptr);
calloc
void *calloc(size_t nmemb, size_t size);
realloc
void *realloc(void *ptr, size_t size);