Linker, Loader und ausführbare Formate
Die Ausführung von „char *p = "hello"; p[0] = 'H';“ in C führt in vielen Umgebungen zu einem abnormalen Abbruch. Welcher Grund ist richtig?
- AWeil die Zeichenkette auf dem Stack lag und nach der Rückkehr aus der Funktion verschwunden war
- BWeil das Zeichenkettenliteral in der schreibgeschützten Section .rodata liegt und versucht wurde, dorthin zu schreiben
- CWeil p mit 0 initialisiert war
Antwort und Erläuterung anzeigen
Antwort: B. Weil das Zeichenkettenliteral in der schreibgeschützten Section .rodata liegt und versucht wurde, dorthin zu schreiben
Zeichenkettenliterale wie "hello" und mit const versehene globale Konstanten liegen in einem schreibgeschützten Datenbereich (.rodata). Da das Schreiben auf diese Seite verboten ist, erkennt die CPU beim Schreibversuch eine Schutzverletzung, und das Betriebssystem beendet das Programm (Segmentation Fault). Soll die Zeichenkette veränderbar sein, wird sie als Array „char s[] = "hello";“ angelegt; dann entsteht in einem beschreibbaren Bereich eine Kopie.