c免费临时指向struct的指针

时间:2015-08-28 13:59:03

标签: c malloc free

我在c中有一个小问题, 我使用冒泡排序对某些数据进行排序(使用tmp更改< => b) 让我们看一些代码,您将会理解。

void ft_sort_dico(t_dico **dico)
{
    int y;
    t_dico *tmp;

    tmp = (t_dico *)malloc(sizeof(t_dico));
    y = 0;
    while (dico[y])
    {
        if (dico[y + 1] && ft_strcmp(dico[y]->key, dico[y + 1]->key) > 0)
        {
            tmp = dico[y];
            dico[y] = dico[y + 1];
            dico[y + 1] = tmp;
            y = -1;
        }
        y++;
    }
    free(tmp); <- error
}

4 个答案:

答案 0 :(得分:1)

你释放了另一个指针而不是malloc - 在你的触及点freetmp指向dico[something]时,这绝对不是你在开始时分配的内存。

答案 1 :(得分:1)

tmp = dico[y];在此处更改tmp指向的地址。您创建了内存泄漏,程序将崩溃&amp;你打电话给自由时燃烧。

答案 2 :(得分:1)

给出这个贴出的代码:

tmp = (t_dico *)malloc(sizeof(t_dico));
y = 0;
while (dico[y])
{
    if (dico[y + 1] && ft_strcmp(dico[y]->key, dico[y + 1]->key) > 0)
    {
        tmp = dico[y];
        dico[y] = dico[y + 1];
        dico[y + 1] = tmp;
        y = -1;
    }
    y++;
}
free(tmp);

tmp最初通过调用malloc()

获取指向某个已分配内存的指针

然后这一行覆盖指针:

tmp = dico[y];

结果是内存泄漏

然后代码将指针传递给dico数组中的一个元素 (从dico[y])到free()函数的那个​​。

要更正此问题,请删除调用malloc()的语句并删除调用free()的语句。

BTW:这种排序算法实际上并没有执行所需的排序。 建议实施bubbleinsertionselection排序。

这是selection排序的算法。

哪里&#39; n&#39;是array []

中的条目数
for ( c = 0 ; c < ( n - 1 ) ; c++ )
{
    position = c;

    for ( d = c + 1 ; d < n ; d++ )
    {
       if ( array[position] > array[d] )
         position = d;
    }
    if ( position != c )
    {
       temp = array[c];
       array[c] = array[position];
       array[position] = temp;
    }
}

答案 3 :(得分:-1)

由于您不想存储tmp指针,因此您可以将tmp定义为局部变量,它将存储在堆栈中,不需要您的手动免费。

当你调用malloc()时,你指定了要分配的块大小,而它实际上使用了更多的空间来记录块大小信息(可能还有别的东西)。这就是为什么当你调用free()时,函数知道要释放多少。

在您的情况下,当您调用free(tmp)时,只要语句dico[y + 1] && ft_strcmp(dico[y]->key, dico[y + 1]->key) > 0成为TRUE一次,指针就不再指向您之前分配的内存(将是一些dico[y])。 free()函数不知道如何释放mch因此返回错误。