昨天,一個同事給我出來一道題,讓我改錯,雖然錯誤我找出來了,但是改錯卻沒有改對,慚愧啊。所以今天做下筆記,算是給自己一個復習吧。
原題代碼如下:
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都是一些設計和編碼上的細節沒有考慮到,所以啊,即使簡單的問題,把它都弄懂,沒事復習下,當把簡單的事都做好了就不簡單了,這時也許你也會成為高手了.哈哈哈哈哈,雞湯了。。。。。。。。。。。。。。
