1. 程式人生 > >指標作為引數的申請記憶體函式

指標作為引數的申請記憶體函式

如果函式的引數是一個指標,不要指望用該指標去申請動態記憶體。

示例程式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);
}