昨天,一个同事给我出来一道题,让我改错,虽然错误我找出来了,但是改错却没有改对,惭愧啊。所以今天做下笔记,算是给自己一个复习吧。
原题代码如下:
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 ",str); free(str); //内存释放 str = NULL; //不加这句会产生野指针哦 return 0; }
放眼看去,这个很简单,但是我当初去修改就爱视乎一个细节,释放str后没有讲str赋值到NULL。伤心啊.....
在从事软件开发的人员,或许有这样的经历,其实很多知识点都不难,很多bug都是一些设计和编码上的细节没有考虑到,所以啊,即使简单的问题,把它都弄懂,没事复习下,当把简单的事都做好了就不简单了,这时也许你也会成为高手了.哈哈哈哈哈,鸡汤了。。。。。。。。。。。。。。