C 打印void类型的值*

C 打印void类型的值*,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); } 人们如何知道

在下文中:

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:2y:2 |

sizeof(strings)
不返回
strings
中的元素数,而是返回更大的值。您的程序未定义。您需要
sizeof(strings)/sizeof(strings[0])

当为第三个参数传递
sizeof(argv[0])
时,您确实应该说
sizeof(strings[0])
,否则代码很难读取

乱码是由于
qsort
读取数组
strings
超出范围,并将通配符指针传递到
cmp
而引起的。大部分的废话都无法打印,所以你得到了很多?人物

内特·埃尔德雷奇抓住了另一半<
cmp
的code>a和
b
参数应转换为
char**
而不是
char*

sizeof(strings)
不返回
strings
中的元素数,而是返回更大的值。您的程序未定义。您需要
sizeof(strings)/sizeof(strings[0])

当为第三个参数传递
sizeof(argv[0])
时,您确实应该说
sizeof(strings[0])
,否则代码很难读取

乱码是由于
qsort
读取数组
strings
超出范围,并将通配符指针传递到
cmp
而引起的。大部分的废话都无法打印,所以你得到了很多?人物


内特·埃尔德雷奇抓住了另一半<
cmp
的code>a和
b
参数应转换为
char**
而不是
char*

再次阅读
qsort
的文档。传递给比较函数的参数不是要比较的对象,而是指向这些对象的指针。因此
x,y
不是字符串本身(即指向字符串字符的指针),而是指向这些指针的指针

所以你想写

int cmp (void *x, void *y) {
    printf("x: %s | y: %s\n", *(char**) x, *(char**) y);
    return 0;
}
另请参见Joshua关于
qsort
的size参数问题的回答

最后,
qsort
比较函数应该使用指向
const void
的指针,而不仅仅是
void
。当您不打算修改它们时,最好将它们保持为常量。在这种情况下,您不想修改
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;
}

再次阅读
qsort
的文档。传递给比较函数的参数不是要比较的对象,而是指向这些对象的指针。因此
x,y
不是字符串本身(即指向字符串字符的指针),而是指向这些指针的指针

所以你想写

int cmp (void *x, void *y) {
    printf("x: %s | y: %s\n", *(char**) x, *(char**) y);
    return 0;
}
另请参见Joshua关于
qsort
的size参数问题的回答

最后,
qsort
比较函数应该使用指向
const void
的指针,而不仅仅是
void
。当您不打算修改它们时,最好将它们保持为常量。在这种情况下,您不想修改
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;
}

你所展示的内容有什么问题?@JonathonReinhart更新了当前输出。你所展示的内容有什么问题?@JonathonReinhart更新了当前输出。