我正在用 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/