錯誤方式申請內(nèi)存
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100); // str 仍然為 NULL
strcpy(str, "hello"); // 運行錯誤
}

Paste_Image.png
毛病出在函數(shù) GetMemory中。編譯器總是要為函數(shù)的每個參數(shù)制作臨時副本,指針參數(shù) p 的副本是 _p,編譯器使 _p =p。如果函數(shù)體內(nèi)的程序修改了_p 的內(nèi)容,就導(dǎo)致參數(shù) p 的內(nèi)容作相應(yīng)的修改。這就是指針可以用作輸出參數(shù)的原因。在本例中,_p 申請了新的內(nèi)存,只是把_p 所指的內(nèi)存地址改變了,但是 p 絲毫未變。所以函數(shù) GetMemory并不能輸出任何東西。事實上,每執(zhí)行一次 GetMemory 就會泄露一塊內(nèi)存,因為沒有用free 釋放內(nèi)存。 如果非得要用指針參數(shù)去申請內(nèi)存,那么應(yīng)該改用“指向指針的指針”
正確方式申請
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); // 注意參數(shù)是 &str,而不是 str
strcpy(str, "hello");
cout<< str << endl;
free(str);
}

Paste_Image.png