const zeiger und const variable

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
QuornJulio
Beiträge: 26
Registriert: 8. Dezember 2011 21:57

const zeiger und const variable

Beitrag von QuornJulio »

hallo,

ich habe mich ein bißl mit dem thema beschäftigt.
es gibt da jedenfalls ein problem, dass ich nicht verstehe.

folgender code:

Code: Alles auswählen

int main() {
	const char* name = "Fritz";
	name = "Andreas";

	cout << name << endl;

	char* const person = "Zivil";
	*person = 'V';

	cout << *person << endl;

	return 0;
}
bei der ausgabe von person entsteht der fehler bzw. das programm
bricht mit einem fehler ab.
ich möchte gerne verstehen, was das problem ist. warum die ausgabe
nicht erfolgt.

bitte um hilfe.

Gruss
QuornJulio
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: const zeiger und const variable

Beitrag von franzf »

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?

Code: Alles auswählen

char* const person = "Zivil";
"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:

Code: Alles auswählen

*person = 'V';
-> SEGFAULT!

Ich hoffe das war jetzt klar.
QuornJulio
Beiträge: 26
Registriert: 8. Dezember 2011 21:57

Re: const zeiger und const variable

Beitrag von QuornJulio »

hallo franzl,

vielen dank für die ausführliche erklärung der unterschiede.
ich habs jetzt verstanden.

const char* oder char const*,
char* const und
char const* const muss ich nur noch verinnerlichen.

gruss
QuornJulio
Antworten