新手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)?
最佳答案
所有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/