Was ist die Bedeutung des C-/C++-Fehlers "Speicherzugriffsfehler (Speicherabzug geschrieben)"?
Ich weiß, dass es mehr helfen würde wenn ich den Quelltext hier einstellen würde, aber ich möchte gar nicht, dass ihr mir bei der Lösung an sich helft.
Ich möchte "nur" wissen, was diese Fehlermeldung genau bedeutet.
Welcher Speicher ist hier gemeint?
Geht es um den Speicher in einer Variablen?
Was ist der Speicherabzug?
Von welchem Wert wird hier was abgezogen?
Wieso wird hier was abgezogen?
Und warum wird überhaupt etwas von einem Wert abgezogen, wenn auf den Speicher doch nicht zugegriffen werden kann?
Sollte der Fehler bei mir später nämlich bei anderen Programmen auftauchen, möchte ich auch dann genau wissen worum es sich hier handelt.
Habe schon ausreichend gegooglet, finde aber nur auf spezifische Programme abgestimmte Lösungen und nicht die Bedeutung des Fehlers an sich.
Ich würde mich auch freuen, wenn mir jemand die Bezeichnung des englischen Derivat bzw. der Fehlermeldung in Englisch geben könnte.
Programmiersprache ist C/C++.
Vielen Dank für jede Hilfe.
7 Antworten
Das ist sogenannter Segmentation fault.
Als Hacker ist dies ein sehr interessanter Fehler, denn irgendwie zeigt die Rücksprung Adresse (eip/rip) in einen invaliden Speicherblock. Mit Speicher ist der Stack, Heap oder sonst sowas im Programm Memory gemeint. Eine invalide Rücksprung Adresse sieht dann vlt so aus: 0x41414141. Wenn sie in den Stack zeigt und dieser als Non Executable gekennzeichnet isz, bekommst du übrigens auch einen Segfault.
C ist eine Programmiersprache, die dem Programmierer viele Freiheiten lässt. Der Compiler führt nur weniger Überprüfungen aus. U. a. hast Du in C die Möglichekit auf den Speicher zuzugreifen und diesen manuell zu verwalten. Dabei können Fehler auftreten. Ein Klassiker wäre mit Sicherheit der Zugriff auf einen Bereich des Arrays, der nicht im zuvor deklarierten Bereich liegt. Solche Fehler sind harmlos, so lange es nicht zu weit ausgereizt wird. Dann stürzt deine Anwendung nicht ab. Du bekommst den unerlaubten Zugriff wahrscheinlich nicht einmal mit.
Ein Segmentaiton Fault, darum geht es in deiner Frage, beschreibt den Zugriff auf einen Speicherbereich, auf den deine Anwendung nicht zugreifen darf. Wenn Du eine Anwendung startest, wird dem Prozess vom Betriebssystem ein bestimmter Speicherbereich des gesamten Arbeitsspeichers zugewiesen. Diesen kann deine Anwendung nutzen. Wenn du auf Speicherbereiche zugreifen möchtest, die außerhalb liegen, dann schreitet das Betriebssystem ein.
Hier hast Du ein Beispiel um einen Segmentation Fault hervorzurufen:
main ()
{
*(int *) 0 = 0;
}
Was passiert da?
Im Beispiel wird versucht NULL den Wert 0 zuweisen. Das ist dem Programm nicht erlaubt.
Das passiert häufig durch fehlerhafte Zeigeroperationen (z.B. keine Speicherallokation oder Schreiben außerhalb der Allokation), was dann beispielsweise dazu führen kann, dass Daten im Stack oder im Datensegment als Code interpretiert werden sollen, die aber als nonexecutable gelten, was zu einem Segmentation fault / core dumped führt.
https://www.geeksforgeeks.org/core-dump-segmentation-fault-c-cpp/
dump = Speicherabzug (dump written oder nur dump)
Mit Abzug wird nicht eine Subtraktion gemeint, sondern ein bestimmter Speicher-Platz mit Infos zu dem Fehler - der Abzug meint hier "Kopie", Kopie der fehlerhaft zugegriffenen Daten
Der Fehler tritt wenn die Rücksprungadresse einer Unterfunktion auf einen ungültigen Speicherblock zeigt, der keinen ausführbaren Code enthält, sondern nur Nutzdaten oder gar nichts definiertes.
Hier wird nichts abgezogen von einem Speicher, ein Speicherabzug ist ein anderes Wort für "Speicherabbild". Sprich: Der aktuelle Stand des Speichers wird für weitere Analysen in eine Datei geschrieben.
Vielleicht hast du beim scanf einfach nur irgendwo den Adressoperator & vergessen?