關於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都是一些設計和編碼上的細節沒有考慮到,所以啊,即使簡單的問題,把它都弄懂,沒事復習下,當把簡單的事都做好了就不簡單了,這時也許你也會成為高手了.哈哈哈哈哈,雞湯了。。。。。。。。。。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM