列表实现中的 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 *)
.
如果您不打算在数组中存储指针,那么您将需要更改分配给数组的方式。
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 *)
.
如果您不打算在数组中存储指针,那么您将需要更改分配给数组的方式。