繁体   English   中英

c 指向结构的空闲临时指针

[英]c free temporary pointer to struct

我在c中有一个小问题,我对一些数据进行排序,使用冒泡排序,(用tmp更改a <=> 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
}

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

tmp = dico[y]; 在这里,您可以更改 tmp 指向的地址。 你造成了内存泄漏,当你调用 free 时程序会崩溃并烧毁。

鉴于此发布的代码:

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 (来自dico[y]的元素)传递给free()函数。

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

顺便说一句:这种排序算法实际上并没有执行所需的排序。 建议实施bubbleinsertionselection排序。

这是selection排序的算法。

其中“n”是数组[]中的条目数

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

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

当您调用malloc() ,您指定将分配的块大小,而它实际上使用稍微更多的空间来记录块大小信息(可能还有其他内容)。 这就是为什么当您调用free() ,该函数知道要释放多少。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM