2013-06-03 126 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; 
}