malloc动态分配内存越界问题

本文探讨了因未正确分配字符串结束符导致的堆越界问题,并解释了malloc与free函数的工作原理。此外,还提供了一种解决方案,通过realloc函数重新分配内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

char *a = (char*)malloc(3 * sizeof(char));
strcpy(a, "123");
free(a);

以上代码会报错,如果加断点调试的话会发现报错点是在free(a)上。

具体原因是忘记了字符串末尾的’\0’结束字符,所以这段内存申请是存在申请不足的问题,从而使得使用时出现了堆越界问题。

我们先想为什么 free()函数为什么不需要指定内存大小就能对动态申请的内存块执行释放操作。这其实就暗含着问题的来源,事实上,malloc在动态申请内存的时候并不是仅仅截取了用户指定大小的一块内存给用户使用,在申请得到的这块内存的前后若干字节里都存着有关这块内存的信息,其中做主要的就是这块内存的大小,在free时候,函数自动查找这个数值进行释放。其中,若malloc返回得到的是int型的内存块时,这块内存的大小的数值存在距离内存块头指针前面0x10的一个int型内存块中,(即,若内存块头指针是0x001c50,申请了10个字节,那么在0x001c40开始的4个字节里的数值刚好是0x28(16进制数))。参考:https://www.cnblogs.com/xxNote/p/4009359.html

所以基于以上实验可想而知如果一旦内存越界,会造成该内存块相关信息遭到破坏,导致free出错。

可以通过如下方法在内存不足时对动态分配的内存进行再分配

char *a = (char*)malloc(3*sizeof(char));
cout << "eat memory!" << endl;
int num = 5;
if (!a)
{
	a = (char*)realloc(a, (num + strlen(a))*sizeof(char));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值