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

标签 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(&arr)?

Full code

最佳答案

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

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

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

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

请注意,由于您已在 free_arr() 中隐藏了 free,因此您必须将参数的类型更改为 Array* 才能修改调用者的指针(其中这正是 free() 无法做到这一点的原因)。然后它被称为:

free_arr( &arr ) ;

关于c - free() 不会释放 C 中的动态(使用 malloc)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45131048/

相关文章:

c - 尝试更改指针会阻止程序执行

c - 为什么这不会进入while循环?

c - 输入带空格、移位字母

c - 如何减少代码中的 for 循环数量

python - NumPy 函数的逐元素运算是否比运算符更快?

c# - 从 String textBox 到 hex 0x byte[] c#

c - 为什么一种 malloc 段错误,而另一种却没有?

c - 将字符存储在数组中,C

java - 弹出堆栈时内存会发生什么情况?

c - 在 C 中使用巨大数组的质数生成器