Newsgroup: it.comp.lang.c
Titolo: teoria | char* come valore di ritorno

salve a tutti. ho un dubbio:
#include <stdio.h>
char *getName();
int main()
{
 printf("%s\n", getName());
 return 0;
}
char *getName()
{
 char *t = "xaero";
 return t;
}
questo semplice programmino è compostoda una funzione che restituisce una stringa (anzi, per essere precisi un'array di char
null-terminated)
l'ho compilato e funziona (ma và?), ma mi aspettavo un seg_fault, per via dell'array ritornata dalla funzione.
quando il programma arriva a return t restituisce il puntatore, ma poi non dovrebbe deallocare lo spazio puntato da t? o lo fa dopo
che ha finito di eseguire la linea che ha chiamato la funzione (getName in questo caso) ?
grazie
ciao
xaero

 poi non dovrebbe deallocare lo spazio puntato da t? 
penso di si`.
Cmq  deallocare non  significa  cancellare  il contenuto:  semplicemente
quell'area di memoria viene segnata come disponibile. Il puntatore punta
ad un'area  di memoria non allocata  e che (per caso)  contiene ancora i
vecchi dati.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
La teoria e' quando sappiamo come funzionano le cose ma non funzionano.
La pratica e' quando le cose funzionano ma non sappiamo perche'.
Abbiamo unito la teoria  e la pratica: le cose non funzionano piu' e non
sappiamo il perche'.

 ha scritto nel messaggio news:99qe9s$ig3$1...@dreamland.darkstar.net...


 che ha finito di eseguire la linea che ha chiamato la funzione (getName in
questo caso) ?
no lo spazio puntato da t nel tuo caso e' una zona di memoria statica.
quello che dici tu succede nel caso:
char *getName()
{
 char array[20];
 char *t = array;
 return t;
}
dove l'array e' dichiarato nello stack.
Le stringhe dichiarate come "testo", sono tutte stringhe statiche (come le
variabili globali), cioe' esistono per tutta la durata del programma.
ciao
donCiccio

questo caso) ?
Come avrai notato ho detto inizialmente "SE" ... in realta'
nel tuo codice non stai facendo nulla di male. Se scrivi
    char *t = "xaero";
 
stai dichiarando una variabile locale puntatore a carattere
che punta ad un array *costante*. Questo array costante ha
una vita indipendente dal puntatore... la variabile in effetti
sparisce quando la funzione termina ma l'array e' ancora al
suo posto e non c'e' nessun problema ad accedervi (in lettura).
Molto diverso se tu avessi scritto:
    char t[]="xaero";
che dichiara un array di caratteri. In questo caso l'array e'
modificabile, locale e sparisce (o per meglio dire non si e'
piu' autorizzati a farvi riferimento) al termine della funzione.
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 non ricordavo che la memoria non allocata si poteva leggere... :)
Solo nel caso che hai postato, visto che il puntatore punta ad area di
memoria statica (e read-only) dove e` memorizzata la stringa.
In tutti gli altri casi sarebbe comunque possibile leggere l'area di
memoria, ma sarebbe impossibile prevedere cosa ne verrebbe fuori.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Non capisco tutta questa eccitazione per il Multitasking: 
io sono anni che leggo in bagno.

che ha finito di eseguire la linea che ha chiamato la funzione (getName in questo caso) ?
se mi ricordo bene gli string literal sono memorizzati da qualche
parte della memoria che non ha nulla a che fare con le variabili sullo
stack. In pratica quello che succede è questo:
0) lanci il programma ;-)
1) il compilatore alloca della memoria e ci mette dentro "xaero"
2) viene eseguita la main
3) all'interno della tua funzione viene allocato sullo stack il
puntatore a char t. Esso viene inizializzato con l'indirizzo nel quale
è memorizzato lo string literal del punto 1
4) l'indirizzo puntato da t è copiato in un temporaneo, che poi è
passato a printf()
5) printf usa il temporaneo, che punta alla memoria del punto 1
tutto questo per dire che la memoria per "xareo" non è allocata sullo
stack ogni volta che è richiamata la funzione: solamente il puntatore
è allocato sullo stack.
Anto
--
Antonio Cuni, 18 anni, studente
Brainbench Certification: 
Master C++: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
http://www.brainbench.com/transcript.jsp?pid=1301688

che ha finito di eseguire la linea che ha chiamato la funzione (getName in
questo caso) ?
Il fatto che lo spazio venga deallocato non implica il fatto che il suo
contenuto effettivo venga variato: viene semplicemente reso di nuovo
disponibile per altre allocazioni. Finché non ci scrivi sopra, probabilmente
il suo contenuto non cambierà, ma non è detto, in nessun caso.
Lanugo