C:分配内存混乱

时间:2013-06-03 10:05:29

标签: 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 < 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;
}

程序分配的次数是否比需要的多两倍?

2 个答案:

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