15、C语言动态内存分配的深入解析

C语言动态内存分配的深入解析

悬空指针与内存状态

悬空指针可能导致释放后使用漏洞(CWE 416),当悬空指针传递给 free 函数时,还会导致双重释放漏洞(CWE 415)。为了减少悬空指针带来的问题,可以在调用 free 函数后将指针设置为 nullptr 。示例代码如下:

char *ptr = malloc(16);
// --snip--
free(ptr);
ptr = nullptr;

这样,后续任何对该指针的解引用操作通常会导致程序崩溃,从而在实现和测试阶段更容易检测到错误。而且,将指针设置为 nullptr 后,多次释放该指针指向的内存不会产生后果。不过, free 函数本身无法将指针设置为 nullptr ,因为它接收的是指针的副本而非实际指针。

动态分配的内存有三种状态:
- 未分配且未初始化:不可读、不可写、不可释放。
- 已分配但未初始化:可写、可释放,但不可读。
- 已分配且已初始化:可读、可写、可释放。

不同的内存状态对应不同的有效操作,应避免对内存进行无效操作。例如,执行以下代码:

char *p = malloc(100);
memset(p, 0, 50);

前50个字节已分配且已初始化,可读取;而后50个字节已分配但未初

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值