Error 1
printf("size=%d",sizeof(access_data*));
prints 4, expected: 16. This was the biggest problem: sorting 8 times 4 bytes, not 8 times 16.
Oddity 2
qsort () expects a pointer to data, but scan () receives the data of a pointer to a pointer. Recommended Fix:
void scan(access_data data[], int len, int sec_to_sec_seek){ qsort(data, len, sizeof(access_data), &compare_data); show_data(data, len); }
Optimization 3
Your compare_data() is equal
int compare_data(const void* a, const void* b){ return ((access_data*)b)->sector - ((access_data*)a)->sector; }
My full work program:
#include <stdio.h> #include <stdlib.h> struct access_data { int sector; int arrival_time; int checked; int processed; }; typedef struct access_data access_data; void show_data(access_data*data, int len) { printf("Showing size=%d",sizeof(access_data*)); for(int i=0;i<len;i++) {printf("data[%d]: arrival_time: %d, sector: %d\n",i,data[i].arrival_time,data[i].sector);} } int compare_data(const void* a, const void* b){ return ((access_data*)b)->sector - ((access_data*)a)->sector; } int compare_data1(const void* a, const void* b){ if (((access_data*)a)->sector < ((access_data*)b)->sector) return 1; else if (((access_data*)a)->sector > ((access_data*)b)->sector) return -1; else return 0; } void scan(access_data data[], int len, int sec_to_sec_seek){ qsort(data, len, sizeof(access_data), &compare_data); show_data(data, len); } int main() { printf("START\n"); access_data data[8]={ {3,4,5,6}, {2,1,5,5}, {1,1,3,6}, {4,4,5,4}, {5,4,3,4}, {6,2,5,6}, {7,2,5,4}, {0,4,5,6} }; scan(data,8, 0); }