/*一道經典的面試題,有時候會搞錯。貼出來,希望大家都注意。*/char * GetMemory(char *p, int num){p = (char *)malloc(sizeof(char) * num);return p;};int main(){char *str = NULL;str = GetMemory(str, 100);strcpy(str, "hello");cout << str << endl;return 0;}/*請問以上程式的輸出是什嗎?*/void GetMemory(char *p, int num){p = (char *)malloc(sizeof(char) * num);};int main(){char *str = NULL; GetMemory(str, 100);strcpy(str, "hello");cout << str << endl;return 0;}/*沒有輸出值。而且,每執行一次GetMemory就會申請一塊記憶體,但申請的記憶體卻不能有效釋放,結果是記憶體一直被獨佔,最終造成記憶體泄露。*//*如果一定要用指標參數去申請記憶體,那麼應該採用指向指標的指標,傳str的地址給函數GetMemory。代碼如下:*/void GetMemory(char **p, int num){*p = (char *)malloc(sizeof(char) * num); /* * str和 *p 表示同一個記憶體單元 *返回申請到的記憶體的首地址addr給str變數; *此時str這個字元指標僅僅作為一個記憶體單元, *其內容即為addr。 */};int main(){char *str = NULL; GetMemory(&str, 100); /* *將 str這個字元指標的地址作為實參傳遞給指標的指標p。 *p和&str內容相同,但不是同一個記憶體單元。 */strcpy(str, "hello");cout << str << endl;return 0;}/*運行之後,可以看到預期的hello字串。*//*另外可以用函數傳回值來傳遞動態記憶體。代碼如下:*/char * GetMemory(char *p, int num){p = (char *)malloc(sizeof(char) * num);return p;};int main(){char *str = NULL; str = GetMemory(str, 100);strcpy(str, "hello");cout << str << endl;return 0;}/*運行之後,可以看到預期的hello字串。*/
又積累了一點,加油!
期待早點把自己賣出去!