[英]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 - 在您到達free
, tmp
指向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()
的語句。
順便說一句:這種排序算法實際上並沒有執行所需的排序。 建議實施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;
}
}
由於您不想存儲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.