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