Ti faccio solo una domanda:

se io scrivessi:
codice:
 v->ptr = (void **) malloc(num_el);
e assumessi che nul_el vale 5 allora io starei allocando 5 byte in memoria, giusto??

Ok, mettiamo il caso che l'allocazione sia corretta, se per inserire un elemento nel vettore scrivessi cosi:
codice:
v->ptr[0] = e;
dove e è un tipo di dato forzato a void.

In memoria cosa accadrebbe??
L'inserimento dell'elemento nel vettore dovrebbe risultare corretta, giusto?