Pagina 1 di 1

Funzioni che ritornano stringhe in C

Inviato: lunedì 15 settembre 2008, 1:19
da skonvols2k
Salve, vorrei un chiarimento.
se ho una funzione del genere:

Codice: Seleziona tutto

char *test(char *str1) {
char *str = calloc(1,strlen(str1)+5);
strcat (str,str1);
strcat(str,".txt");
return str;
}
nel main poi la userei:

Codice: Seleziona tutto

char *stringa=NULL;
stringa=test("file");
è corretto? oppure rischio che la memoria allocata per "str" nella funzione una volta terminata la stessa venga utilizzata da altri?

se esiste questo rischio mi consigliate un modo migliore per farlo ?
GRAZIE

P.S.
anche riferimenti a pagine web dove ciò è ben spiegato sono ben accette.
grazie ancora

Re: Funzioni che ritornano stringhe in C

Inviato: lunedì 15 settembre 2008, 1:55
da dj_def
se ben ricordo i blocchi di memoria assicurati con xalloc non vengono mai rilasciati finché non lo fai esplicitamente, quindi non c'è problema

Re: Funzioni che ritornano stringhe in C

Inviato: lunedì 15 settembre 2008, 8:18
da skonvols2k
e se invece la stringa è inizializzata fixed (tipo char str[50];) ???

Re: Funzioni che ritornano stringhe in C

Inviato: lunedì 15 settembre 2008, 9:54
da IppatsuMan
skonvols2k ha scritto: e se invece la stringa è inizializzata fixed (tipo char str[50];)
Se il tuo codice fosse del tipo:

Codice: Seleziona tutto

char *test(char *str1) {
    char str[50];
    strcat (str,str1);
    strcat (str,".txt");
    return str;
}
Se provassi a farlo il compilatore stamperebbe un messaggio del tipo:

Codice: Seleziona tutto

warning: function returns address of local variable
Questo perché la variabile str verrebbe allocata sullo stack, e questo vuol dire che verrebbe sovrascritta da valori imprevedibili al termine della funzione. Potresti usare str[50] solo dichiarando tale variabile come globale oppure mantenendola come variabile locale ma aggiungendo la keyword static (tale istruzione fa che la variabile venga allocata non sullo stack ma nella sezione .code del programma, e ciò fa che venga preservato il valore della variabile anche al termine della funzione).

Nota a bordo pagina: utilizzando una stringa di dimensioni fisse è bene usare strncat per evitare buffer overflow.