我正在对列表中的一些内存指针进行 qsort() 处理,以便稍后在函数中对它们进行 bsearch。我的问题是,我是否需要将这些值强制转换为 const void * 以外的其他内容才能在 C 中进行合法比较?我可以只进行转换并让编译器告诉我,但我感觉这可能取决于编译器。
最佳答案
比较很好,算术和取消引用不是(因为您不知道基础数据的大小)。所以是的,您可以很好地比较 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)));
}
(a) 服从于指针必须都指向同一数组的元素或该数组之外的元素的正常规则 - 其他任何内容都是未定义的。为了完整起见,我提到了这一点,但是,如果您使用 qsort
,无论如何您都将处理数组。
关于你可以 bool 值小于比较 C 中的 2 个 void * 值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7020645/