新手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)?
答案 0 :(得分:3)
所有free()
需要做的是将已分配的块返回到堆中 - 使其再次可用于分配。
它不会修改指针,也不需要修改指向的数据;它通常会保留其值,直到重新分配并重新用于其他目的。在将内存返回到堆后访问内存是未定义的行为,写入它肯定是一个错误。
最好在释放指针后将指针释放为NULL;这样,任何通过指针的错误访问都将被捕获,例如
void free_arr( Array* arr )
{
free( *arr ) ;
*arr = NULL ;
}
请注意,由于您已将free_arr()
中的空闲隐藏起来,因此必须将参数类型更改为Array*
才能修改调用者的指针(这正是free()
的原因。 1}}不能这样做)。然后它被称为:
free_arr( &arr ) ;