Grundlagen der Programmiersprache C

int *make(void) {
    int x = 42;
    return &x;
}

Was trifft auf den Zeiger zu, den die obige Funktion make zurückgibt?

  1. Ax bleibt bis zum Programmende an derselben Stelle, daher kann über den zurückgegebenen Zeiger jederzeit sicher 42 gelesen werden
  2. Bx wird bei der Rückkehr auf den Heap verschoben, daher muss der Aufrufer es nach der Verwendung mit free freigeben
  3. CDie Lebensdauer von x endet mit der Rückkehr aus der Funktion, daher zeigt der zurückgegebene Zeiger auf eine ungültige Stelle, und seine Verwendung ist undefiniertes Verhalten
Antwort und Erläuterung anzeigen

Antwort: C. Die Lebensdauer von x endet mit der Rückkehr aus der Funktion, daher zeigt der zurückgegebene Zeiger auf eine ungültige Stelle, und seine Verwendung ist undefiniertes Verhalten

x ist eine lokale Variable ohne static (automatische Variable); ihre Lebensdauer endet mit der Rückkehr aus der Funktion, und ihr Platz auf dem Stack wird von anderen Funktionsaufrufen wiederverwendet. Ein Zeiger auf einen Bereich, dessen Lebensdauer abgelaufen ist, heißt Dangling Pointer, und Lesen oder Schreiben über ihn ist undefiniertes Verhalten. gcc warnt vor dieser Schreibweise und erzeugt mitunter Code, der NULL zurückgibt. Abhilfe: den Wert selbst zurückgeben oder einen vom Aufrufer bereitgestellten oder mit malloc reservierten Bereich verwenden.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. Warum wird in C empfohlen, unmittelbar nach free(p); die Anweisung p = NULL; zu schreiben?
  2. Der obigen Funktion save wird die Zeichenkette "ABCDEFGH" mit 8 Zeichen übergeben. Was passiert?
  3. Was trifft in C auf die Dereferenzierung eines NULL-Zeigers zu (wenn *p gelesen wird, während p NULL ist)?
  4. char habe 1 Byte und int 4 Byte, und int werde wie in üblichen Umgebungen an Adressen ausgerichtet, die ein Vielfaches von 4 sind. Welche Ausgabe erzeugt der obige Code bei der Ausführung?
  5. uint32_t sei ein vorzeichenloser 32-Bit- und uint8_t ein vorzeichenloser 8-Bit-Ganzzahltyp, und die Umgebung sei Little-Endian. Welche Ausgabe erzeugt der obige Code bei der Ausführung?