2011-05-29 52 views
2

我需要對指向數組的指針進行排序。實際上,我需要在地址之間進行搜索,以查看數組中是否存在給定結構的指針。不幸的是,在這些結構裏面我沒有什麼「可比的」,所以我想按地址排序。 我的代碼是這樣的:qsort和bsearch指針數組

item* arr[SIZE]; 
//something is inserted 
qsort(arr, SIZE, sizeof(item*), (void*)compare_funct); 
//CUT 
bsearch(curr, arr, SIZE, sizeof(item*), (void*)compare_funct); 

我試圖創建一個compare_funct只是轉換指針爲int並返回它們的區別,但它似乎並沒有工作。特別是,當我做bsearch時,即使我知道元素包含在數組中,我總是會得到一個NULL作爲返回值。

回答

5
int cmp_items(void const *p, void const *q) 
{ 
    item const *a = *(item const **)p, *b = *(item const **)q; 
    return b - a; 
} 

(請不要投compare_functvoid*這並不做任何事情,除了關閉類型檢查挑起未定義行爲)

編輯:作爲@R ..指出,除非ab指向一個共同的陣列,否則上述表現出未定義的行爲。對於完全的可移植性(但是以犧牲即時可理解性爲代價),您應該使用

int compare_pointers(void const *p, void const *q) 
{ 
    return memcmp(p, q, sizeof(item *)); 
} 
+0

這比僅關閉類型檢查更糟糕:它是未定義的行爲。不能安全地將一個函數指針轉換爲數據指針,反之亦然。想象一下,在一個哈佛架構機器上(單獨的數據和程序總線),或者在小型(32位數據,16位函數指針)或中型存儲器型號(16位數據和32位函數指針)中的舊DOS編譯器上會發生什麼。 – 2011-05-29 15:49:32

+0

雖然我們在這裏,'b-a'也是未定義的行爲,除非'b'和'a'碰巧指向一個公共數組。可移植版本是'memcmp(&a,&b,sizeof a);' - 比較指針逐字節的*表示而不是嘗試去改變它們的區別。 – 2011-05-29 16:39:36

+0

你可以簡化它只是'memcmp(p,q,sizeof(item *));' – 2011-05-29 16:41:06

0

here.

這一次把它描述得很好把它當做指針,而不是結構的指針燒焦的。

基本上這個想法是將struct cast轉換爲(void *),然後將其放回struct ** dereference以獲取struct *,然後只進行比較。

使用qsort正確投射可能會非常棘手。