C:分配内存混乱
对于此代码C:分配内存混乱,c,memory-management,C,Memory Management,对于此代码 #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
#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;
}
#包括
#包括
整数*f(整数n)
{
int*ptr=malloc(sizeof(int));
*ptr=n;
返回ptr;
}
int main()
{
int i;
int**ptr=malloc(sizeof(int*));
ptr[0]=f(0);
对于(i=0;i<5;++i)
{
ptr=realloc(sizeof(int*)*(i+2));
ptr[i+1]=malloc(sizeof(int));
ptr[i+1]=f(i+1);
}
对于(i=0;i<5;++i)
{
printf(“%d\n”,*ptr[i]);
自由(ptr[i]);
}
免费(ptr);
返回0;
}
程序分配的内存是需要的两倍吗?是的,您不需要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;
inti;
int**ptr=malloc(sizeof(int*)*6);
对于(i=0;i<6;++i)
{
ptr[i]=f(i);
}
对于(i=0;i<6;++i)
{
printf(“%d\n”,*ptr[i]);
自由(ptr[i]);
}
免费(ptr);
返回0;
顺便说一句,一般来说,您应该尽量不要过于频繁地分配内存,因为它相对较慢。如果您可以使用堆栈,那么您应该,如果不能,请尝试预先分配所有需要的内存,在循环中调用realloc是一个坏主意,应该避免
在这种特定情况下,您不需要指向指针的指针,只需分配一个包含6个整数的数组,其中
int*array=malloc(sizeof(int)*6)
,然后array[0]=0代码>这会更简单更好。是的,它确实分配了两倍所需的内存。此外,main中“ptr”的值被返回的“f”覆盖,因此您甚至没有机会释放它。您可以在“main”中删除对malloc的调用:
是的,它也会泄漏内存。我想这里的内容是学术性的(家庭作业),但是valgrind--leak check=full
在这里可以很好地帮助您(使用调试信息编译程序,以获取可能泄漏内存的行号)。请注意,顺便说一句,您当前版本的程序无法编译。您认为如何?为什么?
int main()
{
int *ptr = f (3);
printf ("%d\n", *ptr);
free (ptr);
return 0;
}