我qsort()列表中的某些內存指針,以便稍後在函數中進行bsearch。我的問題是,我是否需要將這些值類型轉換爲const void *之外的其他值來在C中進行合法比較?我可以做轉換,讓編譯器告訴我,但我有一種感覺,這可能是編譯器依賴。你可以布爾比在C中比較2的void *值嗎?
回答
比較好,算術和解引用都沒有(因爲你不知道底層數據的大小)。所以是的,你可以比較無效指針相當好(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);
}
你不必像str1
和str2
(即使任何像樣的編譯器將優化出來反正)創建的臨時。除了輕微的可讀性問題,有什麼不對:
int compfn (const void *p1, const void *p2) {
return strcmp (*((const char **)(p1)), *((const char **)(p2)));
}
(一)除正常的規則,該指針必須都指向同一個數組或一個超出數組中的元素 - 其他的東西都是未定義的。我提到完整性,但是,如果您使用的是qsort
,則無論如何您都會在數組上工作。
返回strcmp後是否有返回0的原因? –
@耶穌,是的,它被剪切和粘貼更復雜的代碼,然後(幾乎)削減到最簡單的形式。 「幾乎」,因爲我錯過了那一點,我現在已經修正了:-) – paxdiablo
關於你的腳註:void指針的等式比較('=='和'!=')很好,即使它們來自不同的數組,對? –
通常你想要做你的比較功能
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的大小,如果您溢出,可能導致的問題更大不知何故。
這不行,試試'char x [4];比較(x,x + 1)',他們會比較相等(除了幾個奇怪的系統)。 –
@Dietrich,這是我已經陳述過的一個例子......你必須做適當的比較...... –
這是一個例子,但是這並沒有改變這樣的事實,即演員會導致該功能的行爲不正確實際上並不是必須的,因爲比較'void *'是完全合法的,而語義和其他類型的定義一樣。 –
- 1. 比較可空(布爾值)
- 2. 比較XSLT中的xs:布爾值嗎?
- 3. 你可以比較兩個DT_R8值嗎?
- 4. 不可預知的布爾比較C++
- 5. 布爾比較
- 6. 布爾數組值比較
- 7. 比較兩個布爾值
- 8. 比較ArrayLists和布爾值
- 9. Javascript比較布爾值
- 10. 你可以用==比較字符嗎?
- 11. Python中的布爾比較
- 12. CriteriaBuilder布爾比較
- 13. 可以比較布爾操作的結果嗎?
- 14. Python布爾比較
- 15. 這是布爾比較正確的嗎?
- 16. OCaml的布爾比較
- 17. 比較HttpContext的布爾我
- 18. 你可以比較一個int在verilog中的總線嗎?
- 19. C在C中可以比較#
- 20. 比較2 datagridview c值#
- 21. 如何簡化C++布爾比較
- 22. ios比較來自json的布爾值
- 23. 簡化Java布爾比較
- 24. 你可以在bash中的變量賦值中進行比較嗎?
- 25. 如何比較分配給C++中的#define的布爾值
- 26. 比較C中的2個字符值
- 27. 比較java中的數組字符串以獲得布爾值
- 28. 你可以比較JavaScript中的匿名函數嗎?
- 29. EXC_BAD_INSTRUCTION評估布爾比較
- 30. 比較布爾向量
我沒有看到任何理由,它不會作爲void *工作,除非你試圖比較基礎值。 (從你的問題來看,它看起來不像你)。那些不能用void *的東西就是需要知道底層數據類型的東西,所以檢查一個值或者做指針運算。對於你所描述的,比較指向指針的指針,應該沒有問題。 – shelleybutterfly