gpt4 book ai didi

c - 释放后如何将arraylist设置为空?

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:41 24 4
gpt4 key购买 nike

我正在用一些测试来测试我的 array_list:我需要在取消分配后检查我的数组列表是否为空,但是我有一些问题


...
typedef struct array_list{
void** array;
size_t size;
size_t capacity;
}array_list_t;

array_list_t* array_list_new(size_t capacity) {
array_list_t* result = (array_list_t*) malloc(sizeof(array_list_t));
result->array = (void**) malloc(sizeof(void*)*capacity);
result->size = 0;
result->capacity = capacity;
return result;
}


void array_list_free(array_list_t* array) {
free(array->array);
free(array);
}

int array_list_is_empty(array_list_t* list){
if(list->size == 0){
return 1;
}else{
return 0;
}
}
#include "unity.h"
#include "array_list.h"
...

int main () {
array_list_t* array = array_list_new(10);
TEST_ASSERT_EQUAL_INT(1, array_list_is_empty(array)); // 1 == 1 OK
array_list_insert(array,new_int(1));
TEST_ASSERT_EQUAL_INT(0, array_list_is_empty(array)); // 0 == 0 OK
array_list_free(array);
TEST_ASSERT_EQUAL_INT(1, array_list_is_empty(array)); // 1 == 0 NOT_EQUAL
}

我想解决这个问题,在 free 之后将大小设置为 0,例如:

(... free(array); array->size = 0; array->capacity = 0; array = NULL; ...)

我该如何解决这个问题?

最佳答案

一旦您在 array_list_free() 中执行了 free(array),取消引用 array 将不再有效。所以需要在main()中设置array变量为NULL:

array_list_free(array);
array = NULL;

然后 array_list_is_empty() 可以在测试大小之前检查其参数是否为 NULL:

int array_list_is_empty(array_list_t *list) {
return list == NULL || list->size == 0;
}

更好的设计是让 array_list_free() 只释放 array->array,并允许调用者执行 free(array) 当它完成那个数组列表时。这是通常的方法:分配对象的组件负责释放它。

关于c - 释放后如何将arraylist设置为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55960636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com