指標作為引數的申請記憶體函式
阿新 • • 發佈:2019-01-03
如果函式的引數是一個指標,不要指望用該指標去申請動態記憶體。
示例程式1:
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"); // 執行錯誤
}
//每執行一次都會記憶體洩漏
對於傳入的指標引數 p 來說,編譯器會為該引數建立一個臨時副本,例如 _p。函式體中只是修改了形參_p的內容,對於實參p沒有任何影響,想要對指標引數進行修改,要傳遞指標的指標,即二級指標。
正確的程式碼如下:
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); // 注意引數是 &str,而不是 str
strcpy(str, "hello");
free(str);
}