In seiner einfachsten Form ist das ProgrammWarum verursacht dieses C-Programm keinen Segmentierungsfehler mit alphanumerischen Werten?
int main(){
int x;
scanf("%d",x);
}
Wenn wir dieses Programm einen beliebigen numerischen Wert geben als Eingabe durch Erzeugen eines segfault Signal aus, das, was wir erwarten sollten, ist.
Wenn wir aber stattdessen einen alphanumerischen Wert angeben, schlägt nicht fehl.
Was passiert in der scanf
, die dieses Verhalten erzeugt?
der Backtrace von GDB Dies wird, wenn es mit einem numerischen Wert ausgeführt wird:
(gdb) bt
#0 0x00000034e7456ed0 in _IO_vfscanf_internal() from /lib64/libc.so.6
#1 0x00000034e74646cd in __isoc99_scanf() from /lib64/libc.so.6
#2 0x0000000000400553 in main()
Warum ist es nicht wie ‚a‘ für jeden alphanumerischen Wert ausfällt oder ‚dfgb‘?
Sie versuchen hier über * undefined Verhalten * nachzudenken. In diesem speziellen Fall könnte es sein, dass "scanf" nicht einmal versucht, auf das zweite Argument zuzugreifen, da die Eingabe nicht mit der Formatzeichenfolge übereinstimmt. Aber ich würde mich nicht darauf verlassen. –
"Wenn ein Zeichen im Eingabestream mit format-string kollidiert, endet die Funktion und endet mit einem 'übereinstimmenden' Fehler. Das widersprüchliche Zeichen verbleibt im Eingabestream so, als wäre es nicht gelesen worden." Ihre alphabetischen Eingaben stimmen nicht mit dem erwarteten Dezimalformat überein, so dass 'scanf()' beendet wird, ohne zu versuchen, etwas an Ihre fehlerhafte "Adresse" zu schreiben. –
Nicht einverstanden mit "Wenn wir diesem Programm irgendeinen numerischen Wert als Eingabe geben, schlägt es fehl, indem ein Segfault-Signal erzeugt wird, was wir erwarten sollten." Bei diesem Code führt die Eingabe von Zahlen zu einem undefinierten Verhalten, nicht unbedingt zu einer Segmentierung. Seg ist eine mögliche Erwartung, aber nicht die einzige. – chux