Funzioni che ritornano stringhe in C

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
skonvols2k
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 29 marzo 2006, 21:55
Località: Napoli

Funzioni che ritornano stringhe in C

Messaggio 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
dj_def
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3212
Iscrizione: martedì 7 novembre 2006, 3:04

Re: Funzioni che ritornano stringhe in C

Messaggio 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
Avatar utente
skonvols2k
Prode Principiante
Messaggi: 111
Iscrizione: mercoledì 29 marzo 2006, 21:55
Località: Napoli

Re: Funzioni che ritornano stringhe in C

Messaggio da skonvols2k »

e se invece la stringa è inizializzata fixed (tipo char str[50];) ???
Avatar utente
IppatsuMan
Prode Principiante
Messaggi: 199
Iscrizione: mercoledì 14 febbraio 2007, 1:31
Contatti:

Re: Funzioni che ritornano stringhe in C

Messaggio 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.
ハッカー
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti