高質量編程內存管理

有關內存的思考題
void GetMemory(char *p)
{
   p = (char *)malloc(100);
}
void Test(void)
{
    char *str = NULL;
    GetMemory(str);
    strcpy(str, "hello world");
    printf(str);
}
請問運行Test 函數會有什麼樣的結果?
答:程序崩潰。
因爲GetMemory 並不能傳遞動態內存,
Test 函數中的 str 一直都是 NULL。
strcpy(str, "hello world");將使程序崩
潰。
char *GetMemory(void)
{
    char p[] = "hello world";
    return p;
}
void Test(void)
{
    char *str = NULL;
    str = GetMemory();
    printf(str);
}
請問運行Test 函數會有什麼樣的結果?
答:可能是亂碼。
因爲GetMemory 返回的是指向“棧內存”
的指針,該指針的地址不是 NULL,但其原
現的內容已經被清除,新內容不可知。
void GetMemory2(char **p, int num)
{
    *p = (char *)malloc(num);
}
void Test(void)
{
    char *str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf(str);
}
請問運行Test 函數會有什麼樣的結果?
答:(1)能夠輸出hello;(2)內存泄漏

void Test(void)
{
    char *str = (char *) malloc(100);
    strcpy(str, “hello”);
    free(str);
    if(str != NULL)
    {
        strcpy(str, “world”);
        printf(str);
    }
}
請問運行Test 函數會有什麼樣的結果?
答:篡改動態內存區的內容,後果難以預
料,非常危險。
因爲free(str);之後,str 成爲野指針,
if(str != NULL)語句不起作用。

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