Il problema del codice che hai postato è che un array è in realtà un puntatore al primo elemento della lista "omogenea" che hai appena creato.
Per questo motivo, anche se fai
codice:
return nome_dest;
Stai ritornando un riferimento all'array (essendo quest'ultimo un puntatore).
Il compilatore però elimina comunque quest'ultimo alla fine della funzione e dunque dice "Guarda che stai passando un riferimento a un valore temporaneo"
La soluzione, come hai detto tu, è di dichiarare l'array come un puntatore, allocarlo, e restituire il puntatore. Potrai poi usare free al di fuori della funzione, tanto il puntatore punta sempre li!
Pratico esempio
codice:
char * comprimi(char * nome_source)
{
FILE * source;
FILE *dest;
char *nome_dest;
nome_dest = malloc(100*sizeof(char));
strcpy(nome_dest,nome_source);
strcat(nome_dest,".cmp");
source=fopen(nome_source,"r");
dest=fopen(nome_dest,"w");
SET_BINARY_MODE(source);
SET_BINARY_MODE(dest);
def(source, dest, Z_DEFAULT_COMPRESSION);
fclose(source);
fclose(dest);
return nome_dest;
}
int main()
{
char *prova = comprimi("Peppe");
//Cose tue
free(prova);
return 0;
}