我试图实现一个动态泛型array.然而,当我测试我的代码时,我得到的结果是"分段错误".我知道这个错误是由函数ArrayListReSize中的realloc引起的,但是为什么呢?
以下是我实现的几个方法:
typedef struct ArrayList {
void** arr;
size_t allocated, len;
} ArrayList;
int ArrayListInit(ArrayList *list) {
list = (ArrayList *)malloc(sizeof(ArrayList));
if (list == NULL) {
fprintf(stderr, FAILED_ALLOCATION_MSG);
return -1;
}
list->allocated = 0;
list->len = 0;
list->arr = (void **)NULL;
return 0;
}
int ArrayListAppend(ArrayList *list, void *item) {
if (item == NULL) {
fprintf(stderr, INVALID_ARG_MSG);
return -1;
}
if (ArrayListResize(list, list->len + 1) == -1) {
return -1;
}
list->arr[list->len] = item;
return 0;
}
int ArrayListResize(ArrayList *list, size_t len) {
void **arr;
size_t allocated = list->allocated, new_allocated;
if (allocated >= len && len >= (allocated >> 1)) {
assert(list->arr != NULL || len == 0);
list->len = len;
return 0;
}
if (len == 0)
new_allocated = 0;
else
new_allocated = len + (len >> 3) + (len < 9 ? 3 : 6);
arr = (void**)realloc(list->arr, sizeof(void *) * new_allocated); // Here I get the segmentation fault
if (arr == NULL) {
fprintf(stderr, FAILED_REALLOCATION_MSG);
return -1;
}
list->arr = arr;
list->allocated = new_allocated;
list->len = len;
return 0;
}
这是测试代码:
int* GenerateIntPointer(int n) {
int* ptr_int = (int*)malloc(sizeof(int));
*ptr_int = n;
return ptr_int;
}
int main() {
ArrayList list;
ArrayListInit(&list);
for (size_t i = 0; i < 10; i++) {
ArrayListAppend(&list, (void*)GenerateIntPointer((int)i));
}
ArrayListDelete(&list, free);
return 0;
}