sidとdidの情報を保持しながら、エラー率を並べ替える意図を持って、以下の構造体を並べ替えようとします。コンパイルエラーはありませんが、実行時にセグメンテーション違反が発生します。何が悪かったのかしら…。
#include <stdio.h>
#include <stdlib.h>
struct linkdata {
    int sid;
    int did;
    double err;
};
typedef struct linkdata LD;
typedef int (*qsort_func_t)(const void *, const void *);
static int compareByErr (const void * a, const void * b)
{
    fprintf(stderr, "aerr=%.3f, berr=%.3f\n", (*(LD**)a)->err, (*(LD**)b)->err);
    int aerr = (*(LD**)a)->err;
    int berr = (*(LD**)b)->err;
    return aerr - berr;
}
int main() {
    int idx;
    int numnode;
    struct linkdata* perr;
    qsort_func_t qsort_func = compareByErr;
    numnode = 3;
    perr = (LD*) malloc (numnode*numnode*sizeof(LD));
    perr[0].sid = 0; perr[0].did = 1; perr[0].err = 0.642; 
    perr[1].sid = 0; perr[1].did = 2; perr[1].err = 0.236; 
    perr[2].sid = 0; perr[2].did = 3; perr[2].err = 0.946;
    idx = 3;
    qsort(perr, idx, sizeof(perr), compareByErr);
    int i;
    for (i=0; i<idx; i++){
       fprintf(stderr,"err[%d][%d] = %.3f\n", perr[i].sid, perr[i].did, perr[i].err);            
    }
    free(perr); 
}