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