malloc释放的想到的问题

本文探讨了在C/C++中使用malloc分配内存后尝试释放非头部指针指向的内存块时可能出现的问题,并通过实例解释为何这种做法会导致程序错误。

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

原因是这样的,在看我们的服务后台代码时,发现如下段代码有点意思:

 char *s = strdup(“xxxxx");   //拷贝一堆字符串
  while (char *token = strsep(&s, ","))
  {
    layers.push_back(atoi(token));
  }
  free(s);

strsep中针的位置会做改变,如果释放一个非头部的指针会怎样呢,之前没有考虑过,然后就做了个小测试,记录一下免得以后又忘了。

 

void main(){
 char *s;
 s=(char *)malloc(sizeof(char)*10);
 s++;
 free(s);
}
先任意分配一段空间,然后指针忘下指一下,然后释放,这样运行后会报错误。

如果s没有分配空间那样报错是可以理解的(因为释放了野指针),但现在分配了空间,而且malloc分配的是连续的空间,s+1的地址肯定也是知道的啊,为什么释放的时候会报错,free时只能释放malloc返回的头指针吗,而且free是怎么确定该释放多大的空间的?


拙见:
刚才百度了半天,觉得是malloc分配空间时不仅仅是返回了头指针,还记录了很多头部的细节,释放时能根据这些信息来释放,随便给一个指针会被当做野指针释放,最终肯定会报错的,至于malloc记录了哪些信息就不知道了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六个沃德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值