• 关于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
    ",str);
        free(str);    //内存释放
        str = NULL; //不加这句会产生野指针哦
    
        return 0;
    }

      放眼看去,这个很简单,但是我当初去修改就爱视乎一个细节,释放str后没有讲str赋值到NULL。伤心啊.....

      在从事软件开发的人员,或许有这样的经历,其实很多知识点都不难,很多bug都是一些设计和编码上的细节没有考虑到,所以啊,即使简单的问题,把它都弄懂,没事复习下,当把简单的事都做好了就不简单了,这时也许你也会成为高手了.哈哈哈哈哈,鸡汤了。。。。。。。。。。。。。。

  • 相关阅读:
    hdu 2544 单源最短路问题 dijkstra+堆优化模板
    CImg、libjpeg--介绍、配置(操作JPEG)
    【Android归纳】开发中应该注意的事项
    iOS測试——置换測试: Mock, Stub 和其它
    <html>
    系统吞吐量、TPS(QPS)、用户并发量、性能測试概念和公式
    hdu 1038 Biker&#39;s Trip Odometer(水题)
    java泛型
    从头认识Spring-2.1 自己主动装配(2)-byType(2)
    11.2.0.3 RAC(VCS)节点crash以及hang的问题分析
  • 原文地址:https://www.cnblogs.com/huiz/p/8213846.html
Copyright © 2020-2023  润新知