我在C中寫入一個函數,它接受一個鏈表和一個謂詞,並返回一個包含滿足此條件的鏈表的所有值的數組。這裏的功能:C Realloc錯誤 - 「Assertion`ptr == alloc_last_block'失敗!」
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 ***」
我打開了GDB在i = 4時調用realloc之前告訴它打破。然後我嘗試從GDB手動調用realloc(vals,i * vps),並得到錯誤消息:「由ld.so檢測到的不一致:dl-minimal.c:138:realloc:聲明`ptr == alloc_last_block'失敗! 」
任何人都知道發生了什麼事?
這樣做。接得好。爲什麼這些演員陣容無效? – Nick 2010-10-05 03:26:31
@Nick:因爲'void *'隱式轉換爲任何其他指針類型(在C中;而不是在C++中)。 – caf 2010-10-05 03:52:02
無效指針('malloc'和'realloc'返回)的整點是它們自動轉換爲任何(非函數)指針類型。爲什麼這是一個糟糕的主意(在風格,可維護性和掩蓋錯誤方面)是一個您可以搜索的主題。 – 2010-10-05 03:53:58