Мне не удалось найти ни одного вопроса по этому поводу, и я думаю, что немного схожу с ума, пытаясь понять это.
У меня есть следующий код:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
int cmp_int(const void *a, const void *b)
{
return * (int *)a - * (int *)b;
}
int main(int argc, char *argv[])
{
int n = 10;
int **arr = calloc(n, sizeof(int *));
srand((unsigned int) time(NULL));
for (int i = n-1; i >= 0; i--) {
arr[i] = calloc(1, sizeof(int));
*(arr[i]) = rand() % 1000;
}
for (int i = 0; i < n; i++)
printf("%d ", *(arr[i]));
printf("\n");
qsort(arr, 10, sizeof(void *), cmp_int);
for (int i = 0; i < n; i++)
printf("%d ", *(arr[i]));
printf("\n");
free(arr);
return 0;
}
Это очень просто, верно? Согласно справочной странице, первый аргумент — это указатель на базовый элемент, а третий аргумент — размер. Однако мне не удается получить массив в виде отсортированного результата. Я все еще не совсем понимаю, какими должны быть первый и третий аргументы для qsort, так как я подозреваю, что именно в этом и заключается ошибка.
Любая помощь приветствуется.
Спасибо.
Изменить: я должен добавить, что этот код, очевидно, не выполняет проверку ошибок и что я пытался протестировать qsort с массивом целых чисел с двойным указателем, поэтому, хотя да, я мог бы использовать обычный массив, который не был предназначен для этого кода (это на самом деле часть большего сегмента в отдельной программе).
return **(int **)a - **(int **)b;
Несмотря на то, что это должно заставить программу работать, в ней есть много странностей и проблем. - person Gene   schedule 24.01.2020return (x < y) - (x > y)
. Таким образом, оператор станетreturn (**(unsigned **)a < **(unsigned **)b) - (**(unsigned **)a > **(unsigned **)b))
- person phuclv   schedule 24.01.2020unsigned
, когда значения имеют типint
? - person chmike   schedule 24.01.2020return **(int **)a - **(int **)b;
. Но так как это не сработает, вам все равно придется сделать 2 сравнения, как указано выше, вint
, а неunsigned int
. - person phuclv   schedule 24.01.2020