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

标签 c memory-management realloc sigabrt

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

相关文章:

memory-management - 对象方法存储在栈还是堆中?

c - 没有 MMU 的内存保护

C:重新分配字符串数组

c - realloc() 无效的下一个大小 - 再一次,我知道

c - socket C 的动态内存分配

c++ - glsl 1.2 + 绘图元素

在 C 测试套件中调用 Swift 代码

c++ - CGREEN编译错误: ‘assertion_tests’ does not name a type

c - 将 FILE 指针传递给 C 函数

c++ - 直接从数组读取时越界地址