PDA

Visualizza la versione completa : [C] curiositÓ allocazione di memoria


francescoprogc
14-01-2008, 17:51
ciao a tutti
il seguente codice

char * comprimi(char * nome_source)
{

FILE * source;
FILE *dest;
char nome_dest[100];


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;

}

mi restituisce il seguente messaggio di warning:
"returning address of local variable or temporary"
perkŔ in pratica la variabile nome_dest Ŕ definita all'interno della funzione

dovrei definire un
char * nome_dest
e poi magari allocare memoria per questa variabile con una malloc.

Ora vorrei sapere
free(nome_dest) dove va richiamata se utilizzassi il malloc?
come dovrei fare per ottenere correttamente un char * in uscita?
Grazie a tutti

di certo non all'interno della funzione

XWolverineX
14-01-2008, 20:01
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


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



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;
}

francescoprogc
15-01-2008, 12:15
grazie mille sei stato molto gentile,
Questo forum diventa di giorno in giorno sempre pi¨ utile

Loading