前言

今天闲着没事去敲一些简单的编程题来复习复习,结果在用free()函数的时候报错了。
由此引发了我的思考。
题目如下:
输入一串字符,以“?”结束。统计其中字母个数,数字个数,其它符号个数。
例:
输入ab123!?
输出Letters=2Digits=3Others=1解题思路:
按照我平常思路的话用一个char数组,来保存字符串,再用判断语句统计。
但是毕竟是来复习的,想着好久没有用malloc()函数,于是就想着用动态分配内存的方法来解决它。
我的代码如下:
#include<stdio.h>
#include<stdlib.h>
void print(char *p);
int main(void)
{char *p=NULL;print(p);return 0;
}
void print(char *p)
{int L,D,O;L=D=O=0;p=(char *)malloc(1000);gets(p);while((*p)!='?'){if((*p)>='a'&&(*p)<='z'||(*p)>='A'&&(*p)<='Z'){L++;p++;continue;}if((*p)>='0'&&(*p)<='9'){D++;p++;continue;}O++;p++;}printf("Letters=%d\nDigits=%d\nOthers=%d\n",L,D,O);free(p);
}
看一下我上面的代码,感觉是不是好像没啥大问题。
我也是这样想的,但是结果是报错了。

看到报错了。于是,我开始了一步步的分析一下究竟是哪里的问题。
最后发现是free()函数的问题。
当我把free()函数删除后,程序就没有报错了,程序正常运行。
如下图:

思考问题

这不禁让我陷入了思考,为啥这样就好了。为啥一用free()函数就报错呢?
在思考了片刻后,我还是百度了一下 找到了一个也是free()函数报错的例子后,顿时有了思路知道了问题所在。我们先看一下一个例子后,再来思考我们的问题。

例子:

#include<stdlib.h>
void main()
{char *test=(char *)malloc(100);test="123";free(test);test=NULL;
}
上面这个代码也是报错的。问题的根源也是free()函数。
当malloc()之后,test就指向了malloc()函数分配的一个内存块。
当test="123";之后,test就指向了123这个常量的地址,而不再是malloc()函数分配的内存块的地址。
当我们free()之后就引发了报错。
通过上面这个例子,我们再来分析现在我们这个代码的问题。
我们判断的时候循环执行了好几次的p++,这时的地址早已不是当初malloc()分配的内存块的初始地址。
由此引发了free()报错的问题。我们的猜想对不对呢?
下面到了测试猜想的环节
思路:  再定义一个 char *s,让其再malloc给p分配内存空间之后,s指向p的地址。
这时s就指向了这个内存块的首地址,最后free(s)看会不会报错。
如果不会报错,那么猜想是正确的。
如果报错,那么猜想就有问题。

直接上图 看测试结果:

没有问题,看来猜想是对的,问题解决。

总结

指向malloc申请的内存的指针,在运用过程中指针的指向千万不要改变,
就算要改变也要用另外一个变量保存malloc申请的内存的地址,最后用free释放,否则会导致内存泄露。

文章的最后,一句话送给我自己 也送给大家 “ 脚踏实地的敲代码,成长的路上没有捷径。”

malloc()之后free报错的原因[详细解析]相关推荐

  1. linux svn e170001 认证失败,jenkins - svn: E170001报错的原因以及解决方案

    1. 什么问题What? 使用Jenkins配置的svn拉取项目,Jenkins报错:svn: E170001; Your credentials to connect to the reposito ...

  2. linux svn e170001,jenkins - svn: E170001报错的原因以及解决方案

    1. 什么问题What? 使用Jenkins配置的svn拉取项目,Jenkins报错:svn: E170001; Your credentials to connect to the reposito ...

  3. php 怎么开启错误报告,总结PHP开启关闭错误报告示例代码以及PHP脚本不报错的原因...

    总结PHP开启关闭错误报告示例代码以及PHP脚本不报错的原因 分类:PHP_Python| 发布:佚名| 查看: | 发表时间:2014/8/28 那么如果PHP脚本不报语法错,会是什么原因呢: 1. ...

  4. canvas生成图片toDataURL报错的原因和解决方法

    canvas生成图片toDataURL报错的原因和解决方法 参考文章: (1)canvas生成图片toDataURL报错的原因和解决方法 (2)https://www.cnblogs.com/suna ...

  5. 关于前端接口报错500原因

    关于前端接口报错500原因 1.前端与后端入参有出入 2.前端请求头与后端有出入造成, 下面展示一些 内联代码片. Content-Type: application/x-www-form-urlen ...

  6. Navicat因导入的sql文件中时间数据类型有参数而报错的原因(例:datetime(3))

    Navicat因导入的sql文件中datetime有参数而报错的原因(例:datetime(3)) 异常原因 电脑安装的MySQL版本低于5.6版本,而MySQL在5.6及以后的版本中对time.ti ...

  7. Oracle 报错 28000原因和解决方法

    Oracle 报错 28000原因和解决方法 使用PLSQL登录Oracle数据库时提示"ORA-28000:这个帐号被锁定". 出现这个问题的原因是:在Oracle databa ...

  8. windows下 python 使用 pip 安装TA-Lib报错的原因及解决方法

    windows下 python 使用 pip 安装TA-Lib报错的原因及解决方法 问题环境 问题描述 问题原因 & 解决办法 问题环境 Windows 10 x64 .python 3.8. ...

  9. DEV C++编写程序出现 [errror]Id returned 1 exit status报错可能出现的原因及解决办法

    前言: 在DEV C++编写程序时总是出现出现 [errror]Id returned 1 exit status报错,但是却找不到任何问题(气死人了),我就为此问题困扰了好几个月,看遍了所有网页.博 ...

最新文章

  1. send/recv阻塞和非租塞不同
  2. 连接数据库版本不一致
  3. jax-ws cxf_走向REST:在Spring和JAX-RS(Apache CXF)中嵌入Jetty
  4. java 方法 示例_Java扫描器具有示例的NextNextShort()方法
  5. 26日直播预告丨 经典知识库:ASM元数据简介及案例分享
  6. python中嵌套函数的应用实例-实例详解python函数的对象、函数嵌套、名称空间和作用域...
  7. 2018.9.18opencv3.4.1 + vs 2017 community +win 10 x64+cmake 3.11.3终终终章!
  8. VMWare虚拟机安装RedHat Linux全过程
  9. 语音信号处理基础(一)
  10. 前后端-SpringBoot-JPA的简单写法(配合前端vue)
  11. tomcat、redis session共存配置
  12. 【node.js】GET/POST请求、Web 模块
  13. 轴承行业PLM解决方案
  14. VBA-关闭屏幕刷新
  15. 关闭vscode中的源代码管理
  16. 酷睿i7 11700什么水平 i711700怎么样 i7 11700属于高端吗
  17. 让老照片重现光彩:Bringing Old Photos Back to Life(实战)
  18. hillin:浮木漂流
  19. DNUICTF反思总结
  20. Mac修改密码导致钥匙串

热门文章

  1. jmeter的性能监控框架搭建记录(Influxdb+Grafana+Jmeter)
  2. tjoi2018D2T2(luogu4590) 游园会 (状压dp)
  3. OpenGL学习笔记以及其它学习思考
  4. linux下remove函数
  5. STM32F103外部晶振由8M变为12M
  6. Python列表,元组,字典的区别
  7. EOS 智能合约源代码解读 (6)合约之action
  8. C++ Primer 5th笔记(chap 16 模板和泛型编程) 类模板的成员函数
  9. PKI/CA (4)根CA信任模型“概述”
  10. 基于区块链的健康链系统设计与实现(1)引言