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更新了当前输出。