2009-08-24 34 views
3

我只是想知道,在下面的情景中,'stringvar'使用的內存在方法1完成執行後釋放了嗎?這樣做是否超出範圍釋放關聯的內存?

// Just some method 
void method2(char* str) 
{ 
    // Allocate 10 characters for str 
    str = malloc(10 * sizeof(char)); 
} 

// Just another method 
void method1() 
{ 
    char* stringvar; 
    method2(stringvar); 

    // Is the memory freed hereafter, or do I need to call free()? 
} 

我問,因爲如果我把一個「自由(STRINGVAR)」的方法1月底,我收到了警告,STRINGVAR是內部方法1未初始化(這是真的)。

回答

22

不,內存釋放method1後,所以你有內存泄漏。是的,使用內存後需要撥打free

你需要一個指針發送到指針method2如果你想讓它分配內存。這是C編程中常見的習慣用法,特別是當函數的返回值保留給整數狀態碼時。例如,

void method2(char **str) { 
    *str = (char *)malloc(10); 
} 

char *stringvar; 
method2(&stringvar); 
free(stringvar); 
+2

謝謝您指出method2中相當嚴重的錯誤。 – emk 2009-08-24 14:59:10

+1

您不應該使用malloc的返回值,因爲這是C. – aib 2009-08-25 07:25:48

+0

如果我想將method2中的「str」作爲一個數組來處理,那麼我將不得不使用* str [x],對不對? – pbean 2009-08-25 09:35:09

0

不,你需要自己調用free()。嘗試把char * stringvar = 0;壓制警告。

2

不僅在method1內未初始化stringvar,而且在method2內爲它分配內存的方式是錯誤的。您更改了method2內指針的副本,但這不會影響method1中指針的副本。您需要使用雙指針,以便method1中的stringvar指向method2分配的內存。

5

不,動態分配的內存不會自動釋放給你。在C中,程序員有責任釋放。另外 - C通過值傳遞變量,str = malloc(10 * sizeof(char));只是分配給本地'str'變量。

好像你想要返回從malloc的獲得的指針,這樣你的程序變爲:

char *method2(void) 
{ 
    // Allocate 10 characters for str 
    return malloc(10 * sizeof(char)); 
} 

// Just another method 
void method1() 
{ 
    char* stringvar; 
    stringvar = method2(); 
    ... 
    free(stringvar); 
} 

另一種選擇,如果你想操縱「STRINGVAR」從內部方法2是通過一個指針到'stringvar',例如

void method2(char** str) 
{ 
    // Allocate 10 characters for str 
    *str = malloc(10 * sizeof(char)); 
} 

// Just another method 
void method1() 
{ 
    char* stringvar; 
    method2(&stringvar); 
    ... 
    free(stringvar); 
} 
+1

不要忘記打電話免費() – plinth 2009-08-24 15:18:28

+1

值得一提的是,'sizeof(char)'保證是標準的1,所以你不需要乘以它。我懷疑它的重要性,但我認爲它看起來沒有一點清潔。 – 2009-08-24 20:19:30

相關問題