qsort
здесь работает, но если каждый член массива v
занимает sizeof(void *)
, почему qsort
ожидает sizeof(int)
?QSort с указателем на указатель на аннулированию
#include <stdio.h>
#include <stdlib.h>
int comp(const void *pa, const void *pb)
{
int a = *(int *)pa;
int b = *(int *)pb;
if (a > b)
return +1;
else
if (b > a)
return -1;
else
return 0;
}
int main(void)
{
int i, a[] = {3, 1, 2, 0, 4};
void **v;
v = malloc(sizeof(void *) * 5);
for (i = 0; i < 5; i++) {
v[i] = &a[i];
}
for (i = 0; i < 5; i++) {
printf("%d\n", *(int *)v[i]);
}
qsort(v[0], 5, sizeof(int), comp); // why sizeof(int) if v is void **
printf("Sorted:\n");
for (i = 0; i < 5; i++) {
printf("%d\n", *(int *)v[i]);
}
free(v);
return 0;
}
David: вы понимаете 'v [i] = &a[i];' выражение в коде, почему это необходимо и почему 'v' является' void * 'здесь корректно? –
@GrijeshChauhan, я должен использовать void ** (как абстракция для универсального контейнера) для сортировки разных типов. –
Правильно !, а 'v [i] = & a [i]' необходимо, потому что вы хотите сортировать 'a [] 'array, но в' qsort() 'вызов вы передаете' v', который не содержит о типе вашего массива 'a []', поэтому вы явно передаете информацию содержания, что 'a [i]' elements являются 'int' , –