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?

  1. AWeil die Zeichenkette auf dem Stack lag und nach der Rückkehr aus der Funktion verschwunden war
  2. BWeil das Zeichenkettenliteral in der schreibgeschützten Section .rodata liegt und versucht wurde, dorthin zu schreiben
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Linker, Loader und ausführbare Formate

  1. Welche Kombination der obigen globalen Variablen wird im Allgemeinen in der Section .bss abgelegt?
  2. Wo liegt während der Ausführung eine in einer C-Funktion deklarierte lokale Variable ohne static (automatische Variable)?
  3. Aus welchem Bereich eines Prozesses wird der mit malloc in C reservierte Speicher im Allgemeinen genommen?
  4. Welche Reihenfolge ist die richtige Speicheraufteilung eines üblichen Prozesses unter Linux u. a., von kleinen zu großen Adressen geordnet?
  5. Welcher Vorteil ergibt sich daraus, Heap und Stack eines Prozesses mit einem großen freien Bereich dazwischen in entgegengesetzte Richtungen wachsen zu lassen?

Vergleiche zu diesem Thema