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

  • 相关阅读:
    如何用jquery实现实时监控浏览器宽度
    关于oracle with as用法
    SQL查询语句,怎样查询重复数据
    Axure RP Pro7.0的key注册码加汉化非破解
    秦曾昌人工智能课程---7、决策树集成学习Tree Ensembles
    秒懂机器学习---分类回归树CART
    秒懂机器学习---朴素贝叶斯
    秒懂机器学习---k临近算法(KNN)
    秒懂机器学习---机器学习无法逃避的梯度下降法
    秒懂机器学习---当机器学习遇上决策树....
  • 原文地址:https://www.cnblogs.com/huiz/p/8213846.html
Copyright © 2011-2022 走看看