我在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
}
答案 0 :(得分:1)
你释放了另一个指针而不是malloc - 在你的触及点free
,tmp
指向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()
的语句。
bubble
或insertion
或selection
排序。
这是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因此返回错误。