列表实现中的 Realloc 在第三次调用时发送 SIGABRT 信号

Realloc in list implementation sends a SIGABRT signal on third call

typedef struct List {
    void **data;
    int dataSize;
    int count;
    int capacity;
} List;

List list_create(int dataSize) {
    List list;
    list.data = malloc(dataSize);
    list.dataSize = dataSize;
    list.count = 0;
    list.capacity = 1;
    return list;
}

void list_add(List *list, void *data) {
    if(list->count == list->capacity) {
        printf("INCREASING LIST...");
        void *temp = realloc(list->data, list->dataSize * list->capacity * 2);
        if(temp == NULL) {
            printf("FAILED\n");
            return;
        } else {
            printf("LIST INCREASED\n");
            list->data = temp;
        }
        list->dataSize = list->dataSize;
        list->count = list->count;
        list->capacity = list->capacity * 2;
    }

    list->data[list->count++] = data;
}

int main(int argc, char *argv[]) {
    List list = list_create(sizeof(int));
    int item1 = 5, item2 = 8, item3 = 3, item4 = 10, item5 = 15;
    list_add(&list, (void *)&item1);
    list_add(&list, (void *)&item2);
    list_add(&list, (void *)&item3);
    list_add(&list, (void *)&item4);
    list_add(&list, (void *)&item5);
    return 0;
}

这里我用 C 实现了自己的列表或动态大小数组。我在我的主函数中测试它,但只有前四个 list_add 调用成功。在第五次调用时——这是列表第三次调整支持它的数组的大小——SIGABRT 信号在下一行发出,程序中止。

void *temp = realloc(list->data, list->dataSize * list->capacity * 2);

我现在有点卡住了,我对 C 中的内存管理和分配还是很陌生。

我认为问题在于您根据大小为 dataSize 的每个元素分配 data 数组,但后来您通过填写 data 数组 void *指点。如果您计划使用数组来保存指针,则应该使用 sizeof(void *) 调整数组大小。这意味着您需要更改两行,即 malloc 调用和 realloc 调用,将 dataSize 替换为 sizeof(void *).

如果您不打算在数组中存储指针,那么您将需要更改分配给数组的方式。