E poi dichiari una variabile di tipo "string", cioè un puntatore a carattere. Dichiarare un puntatore a carattere non implica l'allocazione in memoria dello spazio per scrivere qualcosa, più o meno per lo stesso motivo per cui se pianto un cartello in mezzo a un deserto che punta in una direzione casuale e con su scritto "ufficio postale a 100 m." non è che automaticamente sorge l'ufficio postale a 100 m. E' soltanto un cartello, un'indicazione. Nient'altro.Originariamente inviato da gaten
Sotto gli include, ho dichiarato questo nuovo tipo di dati:
typedef char* string;
Un puntatore è come se fosse quel cartello. Quando lo dichiari ha un valore sporco, casuale, non significativo. Punta ad un'area di memoria qualsiasi dove non è detto che tu abbia permessi di scrittura. Scrivere invece "char num_contacts[70]" significa allocare in memoria spazio per 70 caratteri, quindi hai la possibilità di scriverci (servendoti di num_contacts che è l'indirizzo di base) senza incorrere in errori di violazione di memoria. Ovviamente parliamo di memoria virtuale, ma da un punto di vista astratto ce ne freghiamo.
In conclusione, o ricorri sempre all'allocazione statica (cioè "char num_contacts[70]"), volendo anche riscrivendo la typedef così
e quindi la dichiarazionecodice:typedef char string[70];
oppure dichiari un puntatore semplice e poi ricorri all'allocazione dinamica (vedi malloc(), calloc(), realloc() e free()).codice:string num_contacts;
Tutto questo in realtà senza considerare che nel titolo hai scritto C++ anche se il programma non ha nulla di C++, a parte "using namespace std;" che è completamente inutile in quel caso. Se hai la possibilità di programmare in C++ hai la classe string a disposizione, e comunque per l'allocazione dinamica vanno usati gli operatori new/delete.