2013-06-03 125 views
-2

對於這個代碼C:分配內存混亂

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


int *f (int n) 
{ 
    int *ptr = malloc (sizeof (int)); 
    *ptr = n; 
    return ptr; 
} 


int main() 
{ 
    int i; 
    int **ptr = malloc (sizeof (int *)); 
    ptr[0] = f (0); 
    for (i = 0; i < 5; ++i) 
    { 
     ptr = realloc (sizeof (int *) * (i + 2)); 
     ptr[i + 1] = malloc (sizeof (int)); 
     ptr[i + 1] = f (i + 1); 
    } 
    for (i = 0; i < 5; ++i) 
    { 
     printf ("%d\n", *ptr[i]); 
     free (ptr[i]); 
    } 
    free (ptr); 
    return 0; 
} 

不程序分配兩次比它需要的?

+3

是的,它也會泄漏內存。 –

+0

我想這裏的東西是學術(家庭作業),但'valgrind --leak-check = full'在這裏可以很好地幫助你(用調試信息編譯你的程序來獲取你可能泄漏內存的行號)。請注意,順便說一句,你的程序當前版本不會編譯。 – Evert

+0

_you_想什麼?爲什麼? –

回答

4

是的,你不需要malloc在main中,因爲它會立即被覆蓋在下一行,並且你泄漏了內存。這是一個功課問題嗎?

編輯問題改變

以一種奇怪的方式這是目前泄漏內存。

前幾行不會泄漏,但是當進入循環時,您將隨機分配和分配。 (作爲第一個,realloc需要它的第一個爭論指針重新分配,所以你在那裏丟失ptr

現在你分配ptr大小爲2,然後3,然後4等...至6然後立刻泄漏內存爲您覆蓋了與調用指針f()

你可以寫,所有這樣的:

int i; 
int **ptr = malloc (sizeof(int*) * 6); 
for (i = 0; i < 6; ++i) 
{ 
    ptr[i] = f(i); 
} 
for (i = 0; i < 6; ++i) 
{ 
    printf ("%d\n", *ptr[i]); 
    free (ptr[i]); 
} 
free (ptr); 
return 0; 

順便說一句,你應該在一般儘量不分配記憶太頻繁,這是相對慢。如果你可以使用棧,你應該,如果沒有,嘗試和分配你需要的所有內存,在循環中調用realloc是一個壞主意,應該避免。

在這種特定情況下,您不需要指向指針的指針,您可以剛剛分配一個由6個整數組成的數組,其中int* array = malloc(sizeof(int) * 6)然後array[0] = 0;會更容易和更好。

+0

是的,這是一個作業問題,但我已經簡化了它 –

+0

我會編輯顯示原始問題 –

+0

現在它是否正確地分配內存或? –

3

是的,它會分配兩次所需的內存。另外,main中的「ptr」的值被「f」返回覆蓋,所以你甚至沒有機會釋放它。你可以在「main」中刪除對malloc的調用:

int main() 
{ 
    int *ptr = f (3); 
    printf ("%d\n", *ptr); 
    free (ptr); 
    return 0; 
}