關於用指針作爲函數參數申請動態內存

其實一個很簡單的問題,卻現在纔想明白,真suck...

相信我們都知道傳值調用參數時,不改變實際參數的值。原理:形參是實參的一個copy(副本),而不是指向同一塊內存地址。於是用指針或引用就可以解決這個問題,大多數時候還會節省內存開銷,因爲不用作副本拷貝。

這樣一個例子:

void test(char *ps)
{
 ps = (char *)malloc(10*sizeof(char));
}

int main(void)
{
 char *str = NULL;

 test(str);
 strcpy(str, "abcd");
 cout << str << endl;
 return 0;

用指針作爲參數,在函數內部申請動態內存,結果該程序會崩潰。

原因其實很簡單,ps申請了內存,也就是改變了ps這個副本的內容(即申請的動態內存地址),但函數返回了,原形參ps的內容沒有任何改變,就如同上述的傳值一樣,ps的內容仍爲NULL,於是出錯。

而且不但出錯,該程序還會出現內存泄露的問題,因爲malloc的這塊內存未釋放,也無法釋放了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章