请问为什么这段动态分配内存的代码会出错


//读取一列整数,并按升序排列他们,最后打印这个列表
#include <stdlib.h>
#include <stdio.h>
int compare_integers(int const* a, int const* b)
{
    register int const* pa = a;
    register int const* pb = b;
    return *pa > *pb ? 1 : *pa < *pb ? -1 : 0;
}
int main()
{
    int *array;
    int n_values;
    int i;
    printf("How many values are there?");
    if (scanf("%d", &n_values) != 1 || n_values <= 0) {
        printf("Illegal number of values.\n");
        exit(EXIT_FAILURE);
    }
    *array=malloc(n_values * sizeof(int));
    if (array == NULL) {
        printf("Can't get memory for that many values.\n");
        exit(EXIT_FAILURE);
    }
    for (i = 0; i < n_values; i += 1) {
        printf("?");
        if (scanf("%d", array + i) != 1) {
            printf("Error reading value #%d\n", i);
            free(array);
            exit(EXIT_FAILURE);
        }
    }
    qsort(array, n_values, sizeof(int), compare_integers);
    for (i = 0; i < n_values; i += 1)
        printf("%d\n", array[i]);
    free(array);
    return EXIT_SUCCESS;
}

报错信息如下:

img

函数原型要求你传递的函数指针是一个int(const void*,const void*)类型的

void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));

所以可以将比较函数声明为

int compare_integers(const void* _a , const void* _b)

在函数中进行强转

int* a = (int*)_a;    //强制类型转换

完整的参考

int num[100];
int compare_integers(const void* _a , const void* _b)  //参数格式固定
{
    int* a = (int*)_a;    //强制类型转换
    int* b = (int*)_b;
    return *a - *b;  
}
qsort(num,100,sizeof(num[0]),compare_integers);