Как и в следующем коде, intcmp1 работает правильно, но intcmp получает ошибку сегмента. Я не знаю, почему. Эти два кода выглядят одинаково.Почему этот указатель получил ошибку сегментации C?
Моя системная среда: OS X 10.10.2 64bit; лязг
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int intcmp(const void *v1, const void *v2){ //Segment Fault
return (*((int*)(*(int*)v1)) - *((int*)(*(int*)v2)));
}
int intcmp1(const void *v1, const void *v2){ //No Problem
return (**(int**)v1-**(int**)v2);
}
int main(int argc, char *argv[]) {
int a[5]={0,1,2,3,4};
int **b,i;
b=calloc(5,sizeof(int*));
for(i=0;i<5;i++){b[i]=&a[i];}
printf("cmp1 begin\n");
qsort(b,5,sizeof(int*),intcmp1);
printf("cmp1 end\n");
printf("cmp1 begin\n");
qsort(b,5,sizeof(int*),intcmp);
printf("cmp2 end\n");
}
Не **((int**)a)
равно, как *((int*)(*(int*)a))
?
Зачем вам ожидать, что первая версия будет работать? Вы передаете int **, но бросаете в int *. –
Как они выглядят одинаково? 'int *' не 'int **'. – m0skit0