gpt4 book ai didi

C 重新分配错误 - "Assertion ` ptr == alloc_last_block' 失败!”

转载 作者:太空宇宙 更新时间:2023-11-04 03:06:58 24 4
gpt4 key购买 nike

我正在用 C 编写一个函数,它接受一个链表和一个谓词,并返回一个数组,该数组包含满足此条件的链表的所有值。这是函数:

void **get_all_that(list_t *l, int (*pred)(const void *)) {
void **vals = NULL;
int i = 0; // Number of matches found
const size_t vps = sizeof(void *);
node_t *n = l->first;
while (n) {
if (pred(n->value)) {
vals = (void **)realloc(vals, i*vps); // (*)
vals[i] = n->value;
i++;
}
n = n->next;
}
if (vals != NULL) {
vals = (void **)realloc(vals, i*vps);
vals[i] = NULL; // NULL-terminate array
}
return vals;
}

我传入了一个始终返回 1 的谓词(即 get_all_that 基本上是 to_array),并且在 i=4 的迭代中,我在带星号的行处遇到错误。回溯错误(从 SIGABRT 自动打印)是“*** glibc detected *** ~/list/test: realloc(): invalid next size: 0x0804c0e8 ***”

当 i=4 时,我打开 GDB 告诉它在调用 realloc 之前中断。然后我尝试从 GDB 手动调用 realloc(vals, i*vps) 并收到错误消息:“ld.so 检测到不一致:dl-minimal.c: 138: realloc: Assertion `ptr == alloc_last_block' 失败!"

有人知道这是怎么回事吗?

最佳答案

您的 realloc 分配的元素太少了。尝试将 i 替换为 i+1。在替换您传递给它的指针之前,您还应该检查 realloc 是否失败,否则您将发生内存泄漏(更不用说崩溃,因为您未能检查 NULL) 失败时,从 realloc 的返回值中删除不必要和丑陋的强制转换也很好。

关于C 重新分配错误 - "Assertion ` ptr == alloc_last_block' 失败!”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3860587/

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