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

Mic*_*gan 1 c void-pointers

我是qsort()列表中的一些内存指针,以允许稍后在函数中对它们进行bsearch.我的问题是,我是否需要键入将这些值转换为const void*之外的其他值来在C中进行合法比较?我可以做转换并让编译器告诉我,但我感觉这可能是编译器依赖的.

pax*_*blo 5

比较很好,算术和解除引用不是(因为你不知道底层数据的大小).所以是的,你可以很好地比较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);
}
Run Code Online (Sandbox Code Playgroud)

你不必创建像str1和那样的临时工str2(即使任何体面的编译器都会优化它们).除了轻微的可读性问题外,没有任何问题:

int compfn (const void *p1, const void *p2) {
    return strcmp (*((const char **)(p1)), *((const char **)(p2)));
}
Run Code Online (Sandbox Code Playgroud)

(a)遵循正常规则,指针必须指向同一数组的元素或超出该数组的元素 - 其他任何东西都是未定义的.我提到完整性,但是,如果你正在使用qsort,你还是会在阵列上工作.