swap字符串浅谈

本文通过一个具体的例子分析了C语言中字符串操作可能导致的内存越界问题。在尝试free内存时,出现Memory Check Failed错误,原因是程序对缓冲堆区末尾后的内存进行了写入。问题源于在使用strlen计算字符串长度时,未考虑C风格字符串末尾的''字符,从而在分配内存时少分配了一位。解决方法是确保在分配内存时考虑到'',避免内存越界。
摘要由CSDN通过智能技术生成

(大山中学程序设计I作业)
“啦啦啦啦啦啦音乐真好听”
“啊我这道题怎么Memory Check Failed了,帮我看看呗”
“啊?你又对内存干了什么坏事?”
“你自己看!我感觉我代码没有错啊!”
上代码:

void swap(char *a,char *b)
{
   char *c=0;
   int len=max(strlen(a),strlen(b));
   c=(char *)malloc(sizeof(char)*len);
   strcpy(c,a),strcpy(a,b),strcpy(b,c);
   free(c);
}

好了,这段代码就是Memory Check Failed的黑幕所在。
用Visual Studio 2017 Debug模式断点调试发现free时会报错,报错内容如下:
这里写图片描述

翻译一下:
侦测到堆腐蚀(emmmm我个人觉得应该用leak好一点):C运行库侦测到程序对程序缓冲堆区末尾后的内存进行写入。
大白话就是:你内存操作越界了,你free了原本不是你malloc的内存。
为什么????
好既然已经知道是内存越界了,那我们来分析一下为什么会导致内存越界。
仅分析指针c,给定字符串”karkisthemosthandsomeman\0”。为什么会有\0是因为这是由scanf或其他方式读入的C风格字符串。strlen该字符串返回的长度length=24,于是申请长度为24*sizeof(char)的内存空间,然后写入的时候,把\0也会写进去。
好,越界了。
解决方案也很简单,只需要将

c=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值