0 c int pointers quicksort qsort
我一直在 Kernighan 和 Pike 合着的一本名为“编程实践”的书中学习 C 编程。根据本书中的材料,我编写了一个小程序来对命令行上给出的整数数组进行排序。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 30
char *progname;
int arr[MAXSIZE];
int icmp(int *, int *);
int main(int argc, char *argv[]) {
int i;
progname = argv[0];
if (argc == 1) {
fprintf(stderr, "usage: %s [int ...]\n", progname);
exit(1);
}
for (i = 0; argc > 1 && i < MAXSIZE; i++, argc--) {
arr[i] = atoi(argv[i+1]);
}
int n = i;
qsort(arr, n, sizeof(*arr), icmp);
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
exit(0);
}
int icmp(int *p1, int *p2) {
int v1 = *p1;
int v2 = *p2;
if (v1 < v2) {
return -1;
} else if (v1 == v2) {
return 0;
} else {
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
是的,我的小程序似乎可以运行,我对此很满意。然而,我的实现与书中给出的不同,它似乎没有正确地对整数进行排序。作者将 icmp() 定义为:
int icmp(const void *p1, const void *p2) {
int v1, v2;
v1 = *(int *) p1;
v2 = *(int *) p2;
if (v1 < v2) {
return -1;
} else if (v1 == v2) {
return 0;
} else {
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?我的版本也从 gcc 发出警告:
warning: passing argument 4 of 'qsort' from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)
但是,具有正确指针类型的 qsort 没有正确排序我的整数!这里很困惑。如果有人能启发我,我将不胜感激。
qsort 比较:为什么 const void *?
如果您检查 的原型qsort,您会发现:
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
Run Code Online (Sandbox Code Playgroud)
compar函数的参数类型const void *如您所见。
void *因为qsort应该对泛型类型进行排序,而不仅仅是int. 您可以对数组double、数组string、数组等进行排序struct。const void *为了避免意外更改指针指向的数据(在该compar函数内)。这只是关键字的典型安全措施const。