qsort比较:为什么const void *?

时间:2016-01-11 02:46:43

标签: c pointers int 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;
    }
}

是的,我的小程序似乎有效,我对它很满意。但是,我的实现与本书中给出的实现不同,它似乎没有正确地排序整数。作者将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;
    }
}

这笔交易是什么?我的版本也会从gcc发出警告:

warning: passing argument 4 of 'qsort' from incompatible pointer type

但是,具有正确指针类型的qsort未正确排序我的整数!这里很困惑。如果有人能够启发我,我将非常感激。

1 个答案:

答案 0 :(得分:4)

  

qsort比较:为什么const void *?

如果你查看qsort的原型,你会发现:

void qsort (void* base, size_t num, size_t size,
        int (*compar)(const void*,const void*));

您注意到compar函数的参数类型为const void *

  • 它是void *因为qsort应该对通用类型进行排序,而不仅仅是int。您可以对double数组,string数组,struct数组等进行排序。
  • const void *以避免意外更改指针指向的数据(在compar函数内)。这只是关键字const
  • 的典型安全指标