Newsgroup: it.comp.lang.c++
Titolo: [C-like string] Dubbio comportamento

Ciao,
sto studiando il C++, chiedo scusa anticipatamente per l'eventuale 
banalità dei miei quesiti, ma non capisco il comportamento di char[] 
usato come stringa, es:
#include <iostream>
using namespace std;
int main(){
int strlen = 0;
char t[10];
cin >> t;
cout << t << endl;
while (t[strlen] != '\0'){
     cout << t[strlen];
     strlen++;
}
system("pause");
return 0;
}
Come mai se inserisco più di 9 caratteri non mi dà errore (char 
s[4]="ciao" me lo segnala, giustamente credo, come errore)?
Ho fatto la seconda stampa con while per controllare se '\0' era 
presente, ho pensato che magari il C++ utilizzasse una classe per 
simulare le stringhe del C... insomma credevo che un array non dovesse 
mai andare "out of bounds", è una struttura dati non ridimensionbile o no ?
Grazie a tutti per l'attenzione.

 mai andare "out of bounds", è una struttura dati non ridimensionbile o no ?
Appunto. Non essendo ridimensionabile *va* in "out of bounds" ma il
compilatore non è tenuto a segnalarlo (spesso lo segnala il sistema
operativo ma non è detto).
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 operativo ma non è detto).
Uso un ambiente di programmazione che si chama Dev-C++ con XP Pro SP2 e 
g++ 3.3.2 con Fedora Core 3, con entrambi ottengo il ridimensionamento 
dell'array "in base al cin", scusa l'inesattezza ma credo si capisca.
Grazie ancora per la pronta risposta, saluti.

 dell'array "in base al cin", scusa l'inesattezza ma credo si capisca.
No! Ripeto: non c'è nessun ridimensionamento. Un array definito di n
elementi resta di n elementi.


 dell'array "in base al cin", scusa l'inesattezza ma credo si capisca.
Boh. Non si capisce che cosa intendi. Non c'è alcun "ridimensionamento".
La questione è molto semplice. Se l'array 't' è di 10 elementi, 
l'espressione 't[i]' è valida soltanto per valori valori compresi tra 0 e 9 
(estremi inclusi). L'uso di altri valori produce un comportamento non 
definito, ed è quindi un *errore* del programmatore. E' una regola del 
linguaggio. Se la violi, non puoi sapere cosa accedrà. Un po' come guidare 
a fari spenti nella notte.
Max

 dell'array "in base al cin", scusa l'inesattezza ma credo si capisca.
No. Non lo ottieni. Semplicemente vai a sovrascrivere aree di memoria del
processo per cui al piu` incasini il processo stesso, ma il sistema
operativo non ti blocca.
Fai questo bel giochino. Prima di tutto, premetto che quanto segue dipende
chiaramente dall'architettura. Visto che uno degli ambienti da te indicati
e` DevCpp e lo avevo ora in mano, lo ho scritto per quello.
#include <iostream>
int main(){
    char arr[8] = "hello";
    char arr2[1];
    std::cout << "Indirizzo di memoria di arr:\t" <<(void*)arr <<std::endl 
         << "Indirizzo di memoria di arr2:\t" << (void*)arr2 << std::endl;
 
    std::cout << "arr:\t" << arr <<std::endl;
    std::cin >> arr2;
    std::cout << "arr:\t" << arr << std::endl;
    return 0;
}
Allora. Senza ottimizzazioni o flag vari per un array il gcc pare allocare
la potenza di due immediatamente superiore alla dimensione da te
specificata. Se scrivi '10' in realta` ne saranno comunque allocati 16.
Il primo cout stampa gli indirizzi di arr e arr2. Sulla mia macchina questi
sono (in esadecimale)
| Indirizzo di memoria di arr:    0x22ff88
| Indirizzo di memoria di arr2:   0x22ff80
ovvero:
[ arr2                       arr                    ]
[ 0     1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 ]
 
 
 Bene... se tu scrivi quando ti chiede input piu` di 8 caratteri, questi
verranno scritti dopo i primi 8, invadendo di fatto arr. Che infatti quando
viene stampato dopo l'input, e` cambiato.
| G:\Metodologie>overflow.exe
| Indirizzo di memoria di arr:    0x22ff88
| Indirizzo di memoria di arr2:   0x22ff80
| arr:    hello
| 1234567890
| arr:    90
Comunque se scrivi molti ma molti caratteri, vedi che va in crash.
Appena ho tempo magari provo il tutto anche sulla Debian.
-- 
[ RiK0                                ]
[ non credo negli schemi non vincenti ]
[ two is an odd prime number          ]

 a fari spenti nella notte.
In quel caso lancia un'emozione.
-- 
int


ROTFL
-- 
Anche se detesto quello che dici,
difendero' fino alla morte il tuo diritto a dirlo.
   - Voltaire
/\/ / /-/ / /_   Copyleft (L) 1984, All Rights Reversed