Newsgroup: it.comp.lang.c++
Titolo: Piccolo Sorgente...piccolo problema

Sto cercando di farmi rilasciare da una funzione un puntatore ad un
array di caratteri per poi poterlo stampare nella main, devo farlo
assultamente con i puntatori (quindi sensa l'uso di <string>), ho
riportato il piccolo sorgente:
#include <iostream.h>
char* fun1();
main()
{
 char *pstringa;
 pstringa=fun1();
 for(int n=0;pstringa[n] != '\0';n++) cout << pstringa[n];
}
char* fun1()
{
 char ciao[50] = "OooOOppsss...";
 return ciao;
}
OUPUT:
OŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚ÷.@
Ho provato anche cosě...:
#include <iostream.h>
char* fun1();
main()
{
 char *pstringa;
 pstringa=fun1();
 for(int n=0;pstringa[n] != '\0';n++) cout << pstringa[n];
}
char* fun1()
{
 char ciao[50] = "OooOOppsss...";
 char *pciao=ciao;
 return pciao;
}
OUPUT:
OŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚŚ÷.@
DOv'č l'error(e/i).
TNK

 
Stai restituendo un puntatore a un array locale. Accedere all'indirizzo di
un oggetto dall'esterno del suo scope ha effetti indefiniti.
Puoi rendere l'array permanente aggiungendo la keyword static, ma ricorda
che in questo modo la funzione restituirà sempre lo stesso indirizzo.
In alternativa puoi allocare l'array dinamicamente, ma il chiamante avrà
la responsabilità di liberare la memoria dopo l'uso. Non puoi nemmeno
semplificarti la vita usando un auto_ptr<char>, perchè ti serve un
delete[], non un semplice delete.
In alternativa ancora, puoi passare un buffer alla funzione. Nel qual
caso non serve che la funzione ti restituisca alcunchè.
Max

 }
l'errore è nella funzione fun1
ricordati che una stringa in C è un array di caratteri e che "ciao" in
questo caso punta al primo elemento dell'array ,facendo la "return ciao" tu
fai ritornare il puntatore al primo elemento dell'array mentre quando la
funzione termina (con il return)  il resto dell'array viene disallocato e
perso, quindi per salvaguardare l'array un metodo possibile consiste
 nell'allocare con la new la memoria necessaria per contenerlo in questo
modo:
char *fun1()
{
 char * ciao;
 ciao = new char[50];
 ciao="OooOOppsss...";
 return ciao;
}
questa volta anche se i campi della funzione vengono disallocati dalla
memoria il blocco di 50 caratteri no !
-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   Remove ICE from e-Mail
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 }
A cosa serve esattamente questo?  Allochi 50 bits di memoria che non
vengono ne' mai usati ne' mai rilasciati...  Il giochino funziona
perche' "OooOOppsss..." non e' piu' in una variabile automatica, ma e'
un array di const char che IL TUO ambiente operativo decide di mettere
in una zona di memoria che non viene toccata...
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it

 memoria il blocco di 50 caratteri no !
Attento, quel codice produce quel che si suole chiamare "memory leakage".
Il valore del puntatore restituito da new viene perduto irrimediabilmente
con il secondo assegnamento alla variabile ciao e la memoria allocata non
sarà più recuperabile. Probabilmente intendevi scrivere qualcosa come
  strcpy( ciao, "OooOOppsss...")
 
Max

 Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it


  char ciao[50] = "OooOOppsss...";
