2017-07-16 53 views
-3

新手C問題。我在我的「數組」結構中有動態的int數組「n」,我創建了一個「數組」的實例「arr」,在使用自定義寫函數進行一些操作後(不確定它們是否正確)但是我想刪除「n」 。免費()不會釋放我的動態(與malloc)數組在C

int main() { 
    Array arr = init_arr(5); 
    for (int i = 0; i < arr.length; i++) { 
     arr.n[i] = i; 
    } 
    print_arr(arr); // prints 0 1 2 3 4 
    add_to_arr(&arr, 228); 
    print_arr(arr); // prints 0 1 2 3 4 228 
    remove_from_arr(&arr, 0); 
    print_arr(arr); // prints 1 2 3 4 228 
    free_arr(arr); 
    // ? free_arr_IDK(&arr.n); 
    // ? free(arr.n); // even with this function it wont delete 
    print_arr(arr); // ??? prints 1 2 3 4 228 
} 

但刪除的數字數組,並打印「arr.n」,而不是亂後,它打印我的陣列,正是因爲它是調用free()之前。輸出:

Array size: 5 {0 1 2 3 4 } 
-- added <228> to end of array 
Array size: 6 {0 1 2 3 4 228 } 
-- removed element #0 
Array size: 5 {1 2 3 4 228 } 
Array size: 5 {1 2 3 4 228 } 

Press any key to continue. 

1.是否預期這種行爲? 2.如果沒關係,哪個函數真的刪除了「arr.n」? free_arr(arr)或free_arr(& arr)?

Full code

+1

無法保證使用無效指針會導致崩潰或任何有趣的事情。它可能看起來仍然有效,沒關係。 – Deduplicator

+0

@SeekAddo由於分配和取消分配不是結構的ctors的一部分,複製結構的指針「n」仍然指向相同的地址。 – Rotem

回答

3

所有free()需要做的是分配的內存塊返回堆 - 使其可再次分配。

它不修改指針,也不需要修改指向的數據;它通常會保留其價值,直到它被重新分配並重新用於其他目的。在內存返回堆之後訪問內存是未定義的行爲,並且寫入它肯定是一個錯誤。

將指針free'd設置爲NULL後釋放它是一種很好的做法;這樣,通過指針的任何錯誤訪問將被困住,例如,

void free_arr(Array* arr) 
{ 
    free(*arr) ; 
    *arr = NULL ; 
} 

注意,因爲您已經隱藏自由free_arr()你必須參數的類型更改爲Array*以修改調用者的指針(這也正是free()不能做到這一點)。它因此被稱爲:

free_arr(&arr) ;