Frage

Ich verwende die strlen-Funktion der c-String-Bibliothek. Ich habe eine NULL übergeben Ich weiß, dass ich keine NULL-Zeichenfolge übergeben soll, aber ich brauche eine Erklärung dafür. Der Code sieht ungefähr so aus

main()
{
  int k;
  char *s=NULL;
  strlen(s);
  // k = strlen(s);
}

Auf meinem gcc-Compiler läuft der Kommentar einwandfrei. aber wenn Sie den Kommentar in der Zeile entfernen k=strlen(s);

es erzeugt einen Segmentierungsfehler. Irgendeine Erklärung?

War es hilfreich?

Lösung

Dies ist der Assembler-Code ohne Zuordnung zur int-Variablen

movq    $0, -16(%rbp)
movl    $0, %eax
leave
ret

Der Compiler ruft _strlen nicht auf, da der Wert nicht verwendet wird.

Andere Tipps

Der erste 'strlen'-Aufruf, dem sein Rückgabewert nicht zugewiesen wird, wird wahrscheinlich von Ihrem Compiler optimiert.

Das Übergeben eines Nullzeigers an strlen führt zu undefiniertem Verhalten . Alles könnte passieren. Einschließlich Seg-Fehler.Und ohne Seg-Fehler.

Wenn Sie den genauen Grund wissen möchten, müssen Sie sich den Assembler-Code ansehen, den Ihr Compiler generiert.Dies sagt Ihnen jedoch nichts Nützliches.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top