我正在用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_,基本上是to_array),在迭代的星号行处得到一个错误,其中I=4。回溯跟踪(从sigabt自动打印)上的错误是“***glibc detected***~/list/test:realloc():invalid next size:0x0804c0e8***”
我打开了GDB,告诉它在I=4时调用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 - C重新分配错误-“断言`ptr == alloc_last_block'失败!”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3860587/

10-11 23:06
查看更多