我在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
}

最佳答案

给定这个发布的代码:

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()的语句。

顺便说一句:这种排序算法实际上并不执行所需的排序。
建议实施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;
    }
}

10-06 12:42
查看更多