free()不会在C中释放我的动态(使用malloc)数组

时间:2017-07-16 16:47:19

标签: c arrays

新手C问题。我在“Array”结构中有动态int数组“n”,在使用自定义写入函数进行一些操作之后创建了一个“Array”实例“arr”(不确定它们是否正确)我想删除“n”

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(&amp; arr)?

Full code

1 个答案:

答案 0 :(得分:3)

所有free()需要做的是将已分配的块返回到堆中 - 使其再次可用于分配。

它不会修改指针,也不需要修改指向的数据;它通常会保留其值,直到重新分配并重新用于其他目的。在将内存返回到堆后访问内存是未定义的行为,写入它肯定是一个错误。

最好在释放指针后将指针释放为NULL;这样,任何通过指针的错误访问都将被捕获,例如

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

请注意,由于您已将free_arr()中的空闲隐藏起来,因此必须将参数类型更改为Array*才能修改调用者的指针(这正是free()的原因。 1}}不能这样做)。然后它被称为:

free_arr( &arr ) ;