strlen Rückgabewert kann nicht gespeichert werden
-
28-10-2019 - |
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?
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.