swap字符串浅谈

(大山中学程序设计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=(char)malloc(sizeof(char)len);

改成
c=(char)malloc(sizeof(char)(len+1));

就可以解决问题了。
写程序的时候管理内存是每个C程序员的痛啊……

2017.12.25
Merry Christmas!

Kark.Li

猜你喜欢

转载自blog.csdn.net/weixin_40427089/article/details/78875688