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

时间:2015-02-14 06:20:46

标签: c list void-pointers realloc sigabrt

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中有自己的列表或动态大小的数组实现。我正在我的main函数中测试它,但只有前四个list_add调用成功。在第五次调用时 - 这是列表第三次调整支持它的数组的大小 - SIGABRT信号在下一行发出,程序被中止。

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

我现在有点陷入困境,而且我对C中的内存管理和分配还很陌生。

1 个答案:

答案 0 :(得分:4)

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

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