簡體   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