2017-08-15 100 views
0
int main() 
{ 
    int *p,*q; 
    p=(int *)malloc(sizeof(int)); 
    *p=5; 
    free(p); 
} 

當我檢查free(p)語句的執行後分配到p的內存地址,我觀察到的內存內容爲0。這是正確的行爲,因爲我已閱讀,free不會將內存初始化爲0?free()的內存初始化爲0

+1

它不保證這樣做,但被允許。一些動態內存管理器使用未分配內存的內容將管理數據存儲在可用內存上。能夠訪問它似乎是一個運氣的情況下,它可能很容易導致段錯誤。 – Yunnosch

+0

因爲它的返回類型是void *,所以不需要轉換malloc的返回值。 – MCG

+0

此代碼具有未定義的行爲。 – MCG

回答

3

free(p)返回後*p的內容未定義。它可能是0,42或其他任何東西。

#include <stdlib.h> 
#include <stdio.h> 

int main(void) { 
    int *p, *x; 

    p = malloc(sizeof(int)); 
    *p = 5; 

    // the following will print "0x7fd0cac00350: 5" or similar 
    printf("%p: ", p); 
    printf("%d\n", *p); 

    free(p); 

    printf("%p\n", p); // won't change from before 
    printf("%d\n", *p); // UNDEFINED BEHAVIOR 
} 
+5

我想你是指'* p'的內容。 – Yunnosch

+0

是的,我做到了。謝謝 – Jeremy

+0

即使解引用'p'也是未定義的,不是嗎? – ikegami