-2

For this code

#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;
}

does program allocate twice than it is needed?

4

2 回答 2

4

是的,您不需要 main 中的 malloc,因为它会立即在下一行被覆盖,并且您会泄漏该内存。这是一个家庭作业问题吗?

编辑问题更改

这现在以一种奇怪的方式泄漏内存。

前几行没有泄漏,但是当您进入循环时,您正在随机分配和分配。(首先, 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)and thenarray[0] = 0;会更容易更好。

于 2013-06-03T10:07:05.710 回答
3

是的,它确实分配了两倍所需的内存。此外,main 中“ptr”的值被“f”的返回覆盖,所以你甚至没有机会释放它。您可以在“main”中删除对 malloc 的调用:

int main()
{
    int *ptr = f (3);
    printf ("%d\n", *ptr);
    free (ptr);
    return 0;
}
于 2013-06-03T10:08:56.483 回答