|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jan 2005
Città: Salerno
Messaggi: 108
|
[C++] "Address xxx out of bounds"
Salve a tutti,
ho un problemino a run-time (il compilatore in fase di compilazione non segnala errori) con questo codice: #include <iostream.h> #include <stdlib.h> class Persona { private: char* nome; char* cognome; public: Persona(); Persona(char* , char* ); void stampaPersona(); }; Persona::Persona() { cout << "Non e' stato inizializzato l'attributo NOME, inseriscine uno: "; cin >> nome; cout << endl; nome = NULL; cout << "Non e' stato inizializzato l'attributo COGNOME, inseriscine uno: "; cin >> cognome; cout << endl; } Persona::Persona(char* name, char* surname) { nome = name; cognome = surname; } int main () { Persona persona1; Persona persona3; Persona persona2("mario", "rossi"); return 0; } Dopo aver definito la classe Persona, procedo nel main con l'istanziazione di due oggetti di tale classe...Dopo aver compilato, provo a runnare...appena inserisco il nome di persona1 il programma va in segmentation fault e crasha. Debuggando scopro che quando viene istanziato il primo oggetto persona1 e viene quindi chiamato il costruttore di default, il puntatore a char dell'attributo nome punta in una zona di memoria - 0x23f - taggata nel debugger con la dicitura "<Address 0x23f out of bounds>". Lo stesso NON succede per l'attributo puntatore a char cognome: infatti, se commento il pezzo /* cout << "Non e' stato inizializzato l'attributo NOME, inseriscine uno: "; cin >> nome; cout << endl; */ il programma fila liscio normalmente. Inoltre, continuando ad eseguire le istruzioni nel main Persona persona3; Persona persona2("mario", "rossi"); il programma NON dà più alcun problema nè richiamando il costruttore di default nè chiamando il costruttore con parametri (nemmeno quando vado ad inizializzare l'attributo nome); quasi come se il problema si presentasse se e solo se l'oggetto istanziato è il primo in ordine temporale Sapreste indicarmi una possibile soluzione? Grazie mille! p.s. uso dev-c++ versione 4.01 con debugger insight su win xp
__________________
Tiscali ADSL 20 Mega Flat Router Thomson Speedtouch 585 (ST585) |
|
|
|
|
|
#2 |
|
Registered User
Iscritto dal: Feb 2008
Messaggi: 77
|
Il problema è che tu dichiari due puntatori (tra l'altro non inizializzati...), per cui quando la cin cerca di scriverci dentro crasha, quando invece li fai puntare a "mario" e "rossi" tutto funziona.
Per risolvere ci sono 2 possibilità: 1) Dichiari 2 buffer sufficientemente grandi: char nome[200]; char cognome[200]; 2) Oppure usi le stringhe di C++ std::string nome; std::string cognome; (queste classi si occupano di allocare e poi liberarare la memoria necessaria) Ciao |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Jan 2005
Città: Salerno
Messaggi: 108
|
Quote:
#include <iostream.h> #include <stdlib.h> int main() { char* nome; cin >> nome; cout << nome; system("PAUSE"); return 0; }
__________________
Tiscali ADSL 20 Mega Flat Router Thomson Speedtouch 585 (ST585) |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2788
|
Può funzionare come può non funzionare, come può creare casini perché nome non essendo inizializzato conterrà chissà quale indirizzo dove tu poi vai a scriverci facendo la cin.
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Boser...usa il tag [ code] [ /code] per racchiudere il codice
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:08.




















