gpt4 book ai didi

c - 在C中重新分配内存时出现奇怪的问题

转载 作者:行者123 更新时间:2023-11-30 16:05:51 24 4
gpt4 key购买 nike

我正在尝试学习 C,作为训练示例,我决定编写一个简单的动态大小列表。但我遇到了一个奇怪的问题,代码只能在初始列表大小为 4 的情况下工作。从列表大小 5 开始,我收到错误。

typedef struct {
int* data;
int alloc_size;
int length;
} List;

List create(int init_size) {
List out;
out.data = (int*) malloc(init_size * sizeof(int));
out.alloc_size = init_size;
out.length = 0;
return out;
}

void list_push(List* list, int elem) {
if (list->length == list->alloc_size) {
list->data = (int*) realloc(list->data, 2 * list->alloc_size);
list->alloc_size *= 2;
}
*(list->data + list->length) = elem;
list->length++;
}

int list_pop(List* list) {
list->length--;
return *(list->data + list->length);
}

int main() {

List list = create(5);

for (int i = 0; i < 100; i++) {
list_push(&list, i);
}

while (list.length > 0) {
printf("%d\n", list_pop(&list));
}

return 0;
}

直到create(4),一切都按预期进行。但是,如果列表是使用 create(5) 创建的(即初始大小为 5),则会出现以下错误: malloc: 释放对象 0x7f7ff5c01778 的校验和不正确:可能在释放后进行了修改。损坏值:0x700000006。我真的无法理解什么会导致它只能达到特定的初始大小,因为列表大小无论如何都是动态重新分配的。

最佳答案

这条线有几个问题

list->data = (int*) realloc(list->data, 2 * list->alloc_size);

最明显的是 2 * list->alloc_size 应乘以每个元素的字节大小(sizeof(int)sizeof( *(列表->数据))在本例中)。

最微妙的是,不检查realloc(以及之前的malloc)的返回值,而是无条件分配给list->data。问题是,失败时,它返回 NULL,而传递的指针(list->data)并未失效,应该被释放以避免泄漏。

关于c - 在C中重新分配内存时出现奇怪的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60146390/

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