在下面:
int cmp (void* x, void*y) {
printf("x: %s | y: %s\n", (char*) x, (char*) y);
return 0;
}
int main(int argc, char *argv[]) {
char * strings[] = {"xml", "json"};
qsort(strings, sizeof(strings), sizeof(strings[0]), cmp);
}
如何看到x
、y
的值是多少?当前的方法会产生乱码,例如:
x: 2?|?? | y: 2?|??
最佳答案
再次阅读qsort
的文档。传递给比较函数的参数不是要比较的对象,它们是指向这些对象的指针。所以 x,y
不是字符串本身(即指向字符串字符的指针),而是指向这些指针的指针。
因此你想写
int cmp (void *x, void *y) {
printf("x: %s | y: %s\n", *(char**) x, *(char**) y);
return 0;
}
另请参阅 Joshua 关于 qsort
的大小参数问题的回答。
最后,qsort
比较函数应该采用指向 const void
的指针,而不仅仅是 void
。当您不打算修改它们时,最好将它们保留为 const
。在这种情况下,您不打算修改 x
指向的指针,也不打算修改 *x
指向的字符。所以写起来会更好
int cmp (const void *x, const void *y) {
printf("x: %s | y: %s\n", *(const char* const *) x, *(const char* const *) y);
return 0;
}
关于c - 打印 void* 类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58045052/