2011-08-11 94 views
1

我qsort()列表中的某些內存指針,以便稍後在函數中進行bsearch。我的問題是,我是否需要將這些值類型轉換爲const void *之外的其他值來在C中進行合法比較?我可以做轉換,讓編譯器告訴我,但我有一種感覺,這可能是編譯器依賴。你可以布爾比在C中比較2的void *值嗎?

+0

我沒有看到任何理由,它不會作爲void *工作,除非你試圖比較基礎值。 (從你的問題來看,它看起來不像你)。那些不能用void *的東西就是需要知道底層數據類型的東西,所以檢查一個值或者做指針運算。對於你所描述的,比較指向指針的指針,應該沒有問題。 – shelleybutterfly

回答

5

比較好,算術和解引用都沒有(因爲你不知道底層數據的大小)。所以是的,你可以比較無效指針相當好(a)

但是,請記住,除非要對其地址進行排序,否則通常不會比較傳遞給qsort比較函數的指針。但是,由於它們將按照該順序排序(作爲一個數組),因此沒有太多的用例:-)

您通常將void指針轉換爲特定的指針,然後比較它們指向的內容來。喜歡的東西:

int compfn (const void *p1, const void *p2) { 
    const char *str1 = *((const char **)(p1)); 
    const char *str2 = *((const char **)(p2)); 
    return strcmp (str1, str2); 
} 

你不必像str1str2(即使任何像樣的編譯器將優化出來反正)創建的臨時。除了輕微的可讀性問題,有什麼不對:

int compfn (const void *p1, const void *p2) { 
    return strcmp (*((const char **)(p1)), *((const char **)(p2))); 
} 

(一)除正常的規則,該指針必須都指向同一個數組或一個超出數組中的元素 - 其他的東西都是未定義的。我提到完整性,但是,如果您使用的是qsort,則無論如何您都會在數組上工作。

+0

返回strcmp後是否有返回0的原因? –

+0

@耶穌,是的,它被剪切和粘貼更復雜的代碼,然後(幾乎)削減到最簡單的形式。 「幾乎」,因爲我錯過了那一點,我現在已經修正了:-) – paxdiablo

+0

關於你的腳註:void指針的等式比較('=='和'!=')很好,即使它們來自不同的數組,對? –

0

通常你想要做你的比較功能

int compare(const void *a, const void *b) 
{ 
    int aa = *(int *)a; 
    int bb = *(int *)b; 
    return aa - bb; 
} 

這樣的事情和void *的轉換爲適當的類型(與詮釋的,它只是一個例子)。

與const void *類型進行比較是有效的,但這是地址的比較。如果這是你想要的,那麼如果不是上面的(人爲的例子)適用的話,那很好(取決於你正在比較的內容)。

編輯:對於你的情況

int compare(const void *a, const void *b) 
{ 
    if (a < b) return -1; 
    else if (a == b) return 0; 
    return 1; 
} 

我之所以做這種方式是因爲地址的sizeof(無符號長),這是比int的大小,如果您溢出,可能導致的問題更大不知何故。

+0

這不行,試試'char x [4];比較(x,x + 1)',他們會比較相等(除了幾個奇怪的系統)。 –

+0

@Dietrich,這是我已經陳述過的一個例子......你必須做適當的比較...... –

+0

這是一個例子,但是這並沒有改變這樣的事實,即演員會導致該功能的行爲不正確實際上並不是必須的,因爲比較'void *'是完全合法的,而語義和其他類型的定義一樣。 –