PDA

View Full Version : [C++] "Address xxx out of bounds"


Boser
20-03-2008, 19:27
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 :mbe:


Sapreste indicarmi una possibile soluzione?
Grazie mille!



p.s. uso dev-c++ versione 4.01 con debugger insight su win xp

kernel::panic
20-03-2008, 19:43
class Persona {
private:
char* nome;
char* cognome;
....
};

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 ;)

Boser
20-03-2008, 19:57
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 ;)

In effetti ho fatto un uso di puntatori abbastanza sconsiderato, soprattutto non inizializzandoli...ma a questo punto mi chiedo perchè questo pezzo di codice funzioni :doh:

#include <iostream.h>
#include <stdlib.h>

int main()
{

char* nome;

cin >> nome;

cout << nome;


system("PAUSE");
return 0;
}

wingman87
20-03-2008, 20:05
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.

cionci
21-03-2008, 13:46
Boser...usa il tag [ code] [ /code] per racchiudere il codice