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
}
你free了一个比你malloc还多的指针——在你到达free
的时候,tmp
指向dico[something]
,这肯定不是你一开始分配的内存。
tmp = dico[y];
这里把tmp指向的地址改一下。您创建了内存泄漏,当您调用 free 时程序将崩溃并烧毁。
因为你不想存储tmp
指针,你可以只定义tmp
作为一个局部变量,它会存储在堆栈中,不需要你手动释放。
当您调用 malloc()
时,您指定了要分配的块大小,而它实际上使用了稍微多一点的 space 来记录块大小信息(可能还有其他内容)。这就是为什么当您调用 free()
时,该函数知道要释放多少。
在你的例子中,当你调用free(tmp)
时,只要语句dico[y + 1] && ft_strcmp(dico[y]->key, dico[y + 1]->key) > 0
变为TRUE
一次,指针不再指向你之前分配的内存(会有一些 dico[y]
)。 free()
函数不知道如何释放 mch,因此 return 出错。
鉴于此发布代码:
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
排序的算法。
其中 '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;
}
}
我在 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
}
你free了一个比你malloc还多的指针——在你到达free
的时候,tmp
指向dico[something]
,这肯定不是你一开始分配的内存。
tmp = dico[y];
这里把tmp指向的地址改一下。您创建了内存泄漏,当您调用 free 时程序将崩溃并烧毁。
因为你不想存储tmp
指针,你可以只定义tmp
作为一个局部变量,它会存储在堆栈中,不需要你手动释放。
当您调用 malloc()
时,您指定了要分配的块大小,而它实际上使用了稍微多一点的 space 来记录块大小信息(可能还有其他内容)。这就是为什么当您调用 free()
时,该函数知道要释放多少。
在你的例子中,当你调用free(tmp)
时,只要语句dico[y + 1] && ft_strcmp(dico[y]->key, dico[y + 1]->key) > 0
变为TRUE
一次,指针不再指向你之前分配的内存(会有一些 dico[y]
)。 free()
函数不知道如何释放 mch,因此 return 出错。
鉴于此发布代码:
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
排序的算法。
其中 '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;
}
}