对于此代码
#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;
}
程序分配的次数是否比需要的多两倍?
答案 0 :(得分:4)
是的,你不需要main中的malloc,因为它会在下一行被立即覆盖并且你会泄漏那个内存。这是一个家庭作业问题吗?
编辑更改问题
这现在以奇怪的方式泄露记忆。
前几行没有泄漏但是当你进入循环时,你正在分配和随机分配。 (作为第一个,realloc因为它的第一个争论是重新分配的指针,所以你在那里缺少ptr
现在你将ptr
分配给大小为2,然后是3然后是4等等...直到6.然后在调用{{1}时覆盖指针时立即泄漏内存}
你可以这样写:
f()
顺便说一句,你通常应该尝试不经常分配内存,它相对慢。如果您可以使用堆栈,如果没有,请尝试预先分配所需的所有内存,在循环中调用realloc是个坏主意,应该避免使用。
在这种特定情况下,您不需要指向指针的指针,您可能刚刚分配了一个包含6个整数的数组,其中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;
然后int* array = malloc(sizeof(int) * 6)
会更容易和更好。< / p>
答案 1 :(得分:3)
是的,它确实分配了两倍所需的内存。此外,main中“ptr”的值会被“f”的返回覆盖,因此您甚至没有机会释放它。您可以在“main”中删除对malloc的调用:
int main()
{
int *ptr = f (3);
printf ("%d\n", *ptr);
free (ptr);
return 0;
}