你可以 bool 值小于比较 C 中的 2 个 void * 值吗?

标签 c void-pointers

我正在对列表中的一些内存指针进行 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);
}

您不必创建像 str1str2 这样的临时文件(即使任何体面的编译器无论如何都会优化它们)。除了轻微的可读性问题外,没有任何问题:

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/

相关文章:

c - 在堆栈中查找最小值,时间复杂度为 O(1)

c - 替换运算符 new 和删除似乎会影响 C 库

c - MINGW编译错误: void value not ignored as it ought to be

c++ - delete[] with void* 会导致内存泄漏吗?

c++ - 在一行中将默认类型值的指针作为参数传递

c++ - 如何为 delete 编写一个 C 包装器,它可以快速释放任何给它的类型而不告诉它是什么类型

c - 这段 C 代码中的括号如何使结果如此不同?

在 C 中从十进制转换为不同的数字系统

C++ 非空函数作为函数的参数

c - 为什么 memcpy 使用 void 指针作为参数?