Ist dir der Unterschied zwischen const char* und char* const klar?
Mit der konsistenteren Schreibweise kann man das besser erklären:
const char ist eine andere Schreibweise für char const. Letzteres ist das, wie man das const sonst antrifft, z.B. das const hinter Methoden oder das const hinter dem Zeiger bei "char* const": const macht immer das const, hinter dem es steht.
1) const char* == char const * -> Von hinten gelesen "Zeiger auf konstantes char".
2) char * const -> Konstanter Zeiger auf char.
3) char const * const -> konstanter Zeiger auf konstantes char (das aber nur so nebenbei)
1) Der Zeiger kann verändert werden (hochgezählt oder auf einen anderen char const* gesetzt), allerdings kann kein char an den Pointer zugewiesen werden:
Code: Alles auswählen
char const* a = "Hallo";
char const* b = "Welt";
b = a; // kein Problem
const char* a2 = a; // kein Problem
a2++; // !Kein Problem!
b=a2;
b[1] = 'c'; // Fehler: die Elemente im Array (die chars) sind const!
*b = 'c'; // Fehler!
2) Die Elemente können verändert werden, aber nicht der Zeiger!
Code: Alles auswählen
char* const ca = new char[20] {'a', 'b', 'c', '\0' }; // ACHTUNG: benötigt C++11!
cout << ca << endl;
ca[4] = 'e';
ca[3] = 'd';
ca[5] = '\0';
cout << ca << endl;
char* const cb = new char[20] {'a', 'b', 'c', '\0' };
ca = cb; // ERROR!!!
Und was machst du jetzt?
"Zivil" ist ein Literal, ein "char const *", es liegt sehr wahrscheinlich in einer schreibgeschützten Stelle des Speichers.
Dieses (schreibgeschützte!) Literal (besser: den Zeiger auf das erste Element) weist du jetzt an einen konstanten Zeiger auf ein nicht konstantes char zu.
Ergebnis beim Kompilieren:
Code: Alles auswählen
Warnung: veraltete Konvertierung von Zeichenkettenkonstante in »char*« [-Wwrite-strings]
Ergebnis im Programm: Dein "person" zeigt auf eine schreibgeschützte Stelle!!!!!!!!!
Deshalb schlägt das hier fehle:
-> SEGFAULT!
Ich hoffe das war jetzt klar.