关于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都是一些设计和编码上的细节没有考虑到,所以啊,即使简单的问题,把它都弄懂,没事复习下,当把简单的事都做好了就不简单了,这时也许你也会成为高手了.哈哈哈哈哈,鸡汤了。。。。。。。。。。。。。。

posted @ 2018-01-06 12:12  1点er执着  阅读(2849)  评论(0编辑  收藏  举报