c - 打印 void* 类型的值

标签 c void

在下面:

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);
}

如何看到xy 的值是多少?当前的方法会产生乱码,例如:

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/

相关文章:

c - c 中的嵌入式 perl - 对于 perl_run() 执行的脚本是否有 "runitme error"的标志?

java - 为什么递归中值没有改变?

actionscript-3 - AS3中的void和void有什么区别?

void - 主要的 C/C++ 规范是什么

使用 void 指针数组时出现 C++ 错误

java - 将英里转换为公里/公里转换为英里的无效方法

c - 存储数据并打印双指针

带 HID 的 C/C++ 接口(interface) - USB 设备

c - 为什么我的 '+' 运算符被视为换行符?

c++ - 有没有更快的方法在 SIMD 上乘以 2(不使用乘法)?