ma guarda che X *c e' un puntatore ad un indirizzo di tipo X (anche se questo non e' propriamente vero)

se tu vuoi un array di elementi X(sia X una struttura o cio' che vuoi)
ti basta un puntatore *c e non un **c (che definisce un array di array)
infatti quando fai
(X *)malloc(sizeof(X)*n)
n e' la grandezza dell'area di memoria puntata da c (o se vuoi la grandezza dell' array di oggetti X a cui punta c),
quindi credo(non ho guardato bene)
che il tuo errore sia

void **db;//array di elementi

che deve diventare void *db;