内存管理

作用域

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值