io lo farei così

la funzione va chiamata con il terzo argomento come puntatore di un intero inizializzato a 0
codice:
void copia(int array[],nod *rad,int *i)
{
if (rad==NULL) return;
copia(array,rad->sinistro,i);
array[(*i)]=rad->info;
(*i)=(*i)+1;
copia(array,rad->destro,i);
}
è la prima volta che aiuto qualcuno in questo forum, anche se sono abbastanza sicuro possa andare bene

nel codice che avevi postato tu, la i veniva incrementata solo prima di una chiamata al figlio destro... quindi tutti i figli sinistri venivano sovrascritti nella posizione 0

cmq lolide, secondo me il codice che hai scritto è sbagliato per gli stessi motivi

puoi ottimizzarla eliminando una riga, così:

codice:
void copia(int array[],nod *rad,int *i)
{
if (rad==NULL) return;
copia(array,rad->sinistro,i);
array[(*i)++]=rad->info;
copia(array,rad->destro,i);
}