关于getMemory函数的几点思考
关于getMemory函数的几点思考
昨天,一个同事给我出来一道题,让我改错,虽然错误我找出来了,但是改错却没有改对,惭愧啊。所以今天做下笔记,算是给自己一个复习吧。
原题代码如下:
void GetMemory(char *p) { p = (char *)malloc(100); } void mian() { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); }
这段代码,一看有个特别明显的错误,就是GetMemory(str)这句,可能有的人在存在疑问,str是指针啊,有什么错误?但是你看GetMemory(char* p)里面的参数,两个都是char*类型,其实说的白话点,这种使用方式仅仅是值传递。如果还是存在疑问,请看下面示例代码:
#include <iostream> using namespace std;void test(char* q) {q = " 123"; } int main(int argc, char** argv) {char* p = "abc";test(p);cout<<p<<endl;return 0; }
这个会输出什么那?答案如下图:
这下应该明白为什么了吧?如果还是疑问,那就需要去背背书了.............
那现在总结下上面代码错误点:
1、GetMemory(str)是值传递,所以上面代码中的str依然是NULL,所以在执行strcpy(str, "hello world"); 自然而然就出现程序崩溃了。
2、malloc申请的内存没有释放,会造成内存泄露。
那我们该怎么修改那?这个我相信网上有很多版本,我就不一一举例,就说说我的修改方法,代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h>char* getMemory(int num) {char *p = (char*)malloc(num);//在堆区申请的空间,记得释放哦.....return p; }int main(int argc, char ** argv) {char* str = getMemory(100); //返回的是堆空间,需要手动释放strcpy(str, "hello world!");printf("%s\n",str);free(str); //内存释放str = NULL; //不加这句会产生野指针哦return 0; }
放眼看去,这个很简单,但是我当初去修改就爱视乎一个细节,释放str后没有讲str赋值到NULL。伤心啊.....
在从事软件开发的人员,或许有这样的经历,其实很多知识点都不难,很多bug都是一些设计和编码上的细节没有考虑到,所以啊,即使简单的问题,把它都弄懂,没事复习下,当把简单的事都做好了就不简单了,这时也许你也会成为高手了.哈哈哈哈哈,鸡汤了。。。。。。。。。。。。。。
关于getMemory函数的几点思考相关推荐
- Getmemory函数详解--内存操作的理解
题目:void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemor ...
- 对于GetMemory()函数
对于GetMemory()函数 NO1 void GetMemory(char *p) { p=(char *)malloc(100); } void Test() { char * ...
- 和函数问题的细节思考
和函数问题的细节思考 @(微积分) 回顾一下和函数的问题. http://blog.csdn.net/u011240016/article/details/53104162?locationNum=1 ...
- 关于cv2.cvtColor函数的一些小小的思考
众所周知,python-opencv默认使用的是BGR编码,也就是说,在我们读取一张图片时会偏蓝.如下图所示: 又众所周知,我们可以使用cv2.cvtColor函数对图片进行一个转换 在使用cv2.c ...
- QTimer计时速度不断加快问题和QT中show函数失效问题的思考和处理
使用QT所遇问题之QTimer和show 一. QTimer计时速度不断加快问题 1. 问题的发现 2.问题解决的思路 (1)梳理整个功能实现的逻辑 (2)监控进入定时器中断的次数 (3)跟踪参数lo ...
- 关于 LAF 函数计算的一些思考
LAF 是基于 serverless 架构来做的,如果说 serverless 是一种架构模式的话,那么对LAF 来说,laf 就是 「一个」开发方式. 关于商业化 收费是一定要做的,但是收费是一个手 ...
- write函数返回值的思考
write函数 头文件:#include <unistd.h> 原型:size_t write(int fd, const void *buf, size_t nbytes); 返回值:若 ...
- 二十分钟教你如何将区块链应用与函数计算相结合
前言 本篇文章适合对区块链应用感兴趣或是想要通过函数计算服务进一步开发区块链应用的新人.本文将结合阿里云区块链服务.阿里云函数计算服务.阿里云日志服务 以及社区应用 Marbles,手把手教大家如何将 ...
- python函数的用法详解(作用、定义、调用、函数参数、函数返回值、函数说明文档、函数嵌套使用)
1. 函数的作⽤ 函数就是将⼀段具有独⽴功能的代码块整合到⼀个整体并命名,在需要的位置调⽤这个名称即可完成对应的需求. 函数在开发过程中,可以更⾼效的实现代码重⽤. 2. 函数的使⽤步骤 2.1 定义 ...
最新文章
- OkHttp实现文件上传进度
- WebService到底是什?
- c++入门代码_C/C++编程笔记:C语言入门题之正倒金字塔,正反三角形代码详解
- 什么?你做的差异基因方法不合适?
- java 怎么从date取得年份
- android快速搭建界面,怎么样能快速搭建一个Android APP的界面和框架?
- assert.h库学习
- 用gallery展示图片,实现中间图片稍大,两边较小的效果
- 图像语义分割之特征整合和结构预测
- 易筋SpringBoot 2.1 | 第十八篇:SpringBoot的JDBC异常
- java的oracle考试认证(OCJP)之路
- thinkpadt410接口介绍_ThinkPadT410全程拆解
- 家用NAS进阶折腾之旅—常见NAS系统介绍和一些体会以及QNAP 威联通 TS-563 NAS使用感受
- 详解EMC测试国标GB/T 17626
- SSM小项目(会议管理系统)二整合mybatis(图解超详细)
- 据说99%的程序猿都不懂得这样表白
- latex如何设置字体并加粗_Latex设置字体大小,加粗,加下划线,变斜体_孩纸气_新浪博客...
- android 文字点击展开,仿微信朋友圈,文字展开全文,全文收起功能
- 西门子200SMART(十)写程序的思路
- IBM X3550 m4 微码升级
热门文章
- 计算机打印机显示错误代码,添加打印机失败 提示错误代码0x00000057的解决办法...
- 百度地图导航路线起点、终点、途经点删除的方法
- mssql php 乱码_php mssql中文乱码怎么办
- Linux/CentOS7搭建泰拉瑞亚原版/mod服务器教程
- 第三周 超参数调试、Batch正则化和程序框架(Hyperparameter tuning)
- 遇事不决量子力学?二分法四象限了解一下
- Manjaro(Arch Linux)问题解决方案合集
- 2021年绵阳东辰中学高考成绩查询,绵阳市所有高中学校排名,2021年绵阳市重点高中分数线排名榜...
- 微信公众号迁移丨如何迁移微信公众号 最详细公众号迁移流程和方法
- android如何暂停倒计时,Android – 如何停止和暂停计时器