Newsgroup: it.comp.lang.c++
Titolo: Stranezze?

Mi e` stato sottoposta una osservazione concernente le
costanti stringa. Osservate il seguente codice:
#include  <stdio.h>
void strano(char *s)
{
   s[2]='A';
}
main()
{
   strano("Antonio");           // errore?
   printf("Antonio");
}
Ecco l'output nei vari casi:
BORLAND C++ 3.1 & 5.02		Antonio
DJGPP		              	AnAonio
VISUAL C++ 5.0      		Antonio
Ora lasciando perdere l'output (il borland per default non
fonde le stringe identiche, ma e` possibile farlo ottenendo lo
stesso comportamento del djgpp)... non dovrebbe esserci un
errore di tipo (o almeno una warning) nella main()?
In effetti nella chiamata a strano mi aspetterei
un errore di tipo perche` si cerca di inizializzare un puntatore
a char con un const char* e invece neppure una warning (almeno
con borland C++ 5.02)
Da questo punto di vista una istruzione tipo:
char* s = "Stringa";
non dovrebbe essere lecita.
Che dice lo standard in merito?
Saluti,
Paolo
------------------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
------------------------------------------------------------------


ICQ #34602650

Che dice lo standard in merito?
Che e` lecito assegnare una stringa di lettere ad un char*
per backward compatibility, in quanto nelle passate versioni
del C e C++ le stringhe letterali erano di tipo char*.
Tuttavia e` un errore cercare di modificare una stringa
attraverso il suo puntatore in questo modo.
Stroustrup dice che tale errore puo` essere evidenziato
solo a run-time.
-- 
Roberto Gerola
Email: 
robert...@penguinpowered.com
WWW: 
http://www.penguinpowered.com/~The_Cpp_Compass

 scelta progettuale del linguaggio.
Dipende da cosa si intende; in C, come insegnano le FAQ (Q/A 1.32):
 
1.32:   What is the difference between these initializations?
 
                char a[] = "string literal";
                char *p  = "string literal";
 
        My program crashes if I try to assign a new value to p[i].
 
A:      A string literal can be used in two slightly different ways.  As
        an array initializer (as in the declaration of char a[]), it
        specifies the initial values of the characters in that array.
        Anywhere else, it turns into an unnamed, static array of
        characters, which may be stored in read-only memory, which is
        why you can't safely modify it.  In an expression context, the
        array is converted at once to a pointer, as usual (see section
        6), so the second declaration initializes p to point to the
        unnamed array's first element.
Nella seconda riga, la costante stringa, pur non essendo dichiarata
esplicitamente const, potrebbe ugualmente essere non-modificabile (la
scelta e' implementation dependent).
-- 
Maurizio Loreti                      
http://wwwcdf.pd.infn.it/~loreti/mlo.html
Un. of Padova, Dept. of Physics - Padova, Italy          
lor...@padova.infn.it

Allora, perchè l'output del Visual C++ non da lo stesso del DJGPP?
Se la situazione e` come sul BC++, per default il VC++ non fonde le
stringhe quando possibile, ovvero in una situazione tipo
char* p = "Una stringa";
char* p2 = "Una stringa";
"Una stringa" viene allocata due volte (quello che accadeva con
l'esempio che postai).
Dovresti vedere se c'e` una qualche opzione che permetta di abilitare
la fusione di stringhe uguali, in questo caso l'output che otteresti
sarebbe identico a quello del DJGPP.
Paolo
-----------------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
  Rigorosamente non certificato M$... Una garanzia di qualita`!
-----------------------------------------------------------------

 puntatore).
pszarray è, come specificato d'altronde nel nome stesso, un arrray non
una costante puntatore (e che sarebbe poi?). Altro libro da non
comprare... A proposito: lo Stroustrup 2a edizione mi fa sempre più
schifo ogni volta che lo consulto. La 3a è molto diversa?
EMG