883 Stimmen

Was ist ein Segmentierungsfehler?

Was ist ein Segmentierungsfehler? Ist er in C und C++ unterschiedlich? Wie hängen Segmentierungsfehler und "Dangling Pointer" zusammen?

4voto

victorkolis Punkte 525

In der Informatik ist ein Segmentierungsfehler oder eine Zugriffsverletzung ein Fehler oder eine Fehlerbedingung, die von Hardware mit Speicherschutz ausgelöst wird, die ein Betriebssystem darüber informiert, dass die Software versucht hat, auf einen beschränkten Bereich des Speichers zuzugreifen. -WIKIPEDIA

Sie greifen möglicherweise auf die Computerspeicher mit dem falscher Datentyp . Ihr Fall könnte wie der folgende Code aussehen:

#include <stdio.h>

int main(int argc, char *argv[]) {

    char A = 'asd';
    puts(A);

    return 0;

}

'asd' -> ist ein Zeichenkette und nicht eine Einzelzeichen char Datentyp. Die Speicherung als char bewirkt also, dass die Segmentierungsfehler . Speicherung einiger Daten an der falschen Stelle.

Die Speicherung dieser string oder Zeichenkette als eine einzige char ist der Versuch, einen eckigen Pflock in ein rundes Loch zu stecken.

Aufgrund des Signals abgebrochen: SEGMENTIERUNGSFEHLER (11)

Segm. Ein Fehler ist dasselbe wie der Versuch, unter Wasser zu atmen - die Lungen sind dafür nicht gemacht. Speicher für eine ganze Zahl zu reservieren und dann zu versuchen, sie als einen anderen Datentyp zu verwenden, wird überhaupt nicht funktionieren.

3voto

PHP Worm... Punkte 4712

"Segmentierungsfehler" bedeutet, dass Sie versucht haben, auf Speicher zuzugreifen, auf den Sie keinen Zugriff haben.

Das erste Problem liegt in Ihren Hauptargumenten. Die main-Funktion sollte sein int main(int argc, char *argv[]) und Sie sollten prüfen, ob argc mindestens 2 ist, bevor Sie auf argv[1] zugreifen.

Da Sie außerdem einen Float an printf übergeben (der übrigens bei der Übergabe an printf in einen Double umgewandelt wird), sollten Sie den %f-Format-Spezifizierer verwenden. Der %s-Formatierer ist für Zeichenketten (' \0 '-terminierten Zeichenarrays).

3voto

NPE Punkte 335

Es gibt genügend Definitionen von Segmentierungsfehlern, ich möchte einige Beispiele anführen, auf die ich beim Programmieren gestoßen bin und die vielleicht wie dumme Fehler erscheinen, aber viel Zeit kosten.

  1. Sie können im folgenden Fall einen Segmentierungsfehler erhalten, wenn das Argument type mismatch in printf :

    include <stdio.h>

    int main(){
    int a = 5; printf("%s",a); return 0; }

Ausgabe : Segmentation Fault (SIGSEGV)

  1. Wenn Sie vergessen haben, einem Zeiger Speicher zuzuweisen, aber versuchen, ihn zu verwenden.

    include <stdio.h>

    typedef struct{ int a; } myStruct;
    int main(){ myStruct s; / few lines of code */ s->a = 5; return 0; }

Ausgabe : Segmentation Fault (SIGSEGV)

3voto

Kalana Punkte 5073

Einfache Bedeutung von Segmentation fault ist, dass Sie versuchen, auf einen Speicher zuzugreifen, der Ihnen nicht gehört. Segmentation fault tritt auf, wenn wir versuchen, Aufgaben in einem Nur-Lese-Speicherplatz zu lesen und/oder zu schreiben oder versuchen, Speicher freizugeben. Mit anderen Worten, wir können dies als eine Art von Speicherbeschädigung erklären.

Im Folgenden erwähne ich häufige Fehler von Programmierern, die zu Segmentation fault .

  • Utilisez scanf() in falscher Reihenfolge (vergessen zu schreiben & ).

    int num; scanf("%d", num);// must use &num instead of num

  • Falsche Verwendung von Zeigern.

    int num; printf("%d",num); //num should be correct as num only //Unless You can use num but you have to point this pointer to valid memory address before accessing it.

  • Ändern eines Zeichenkettenliterales (Zeigerversuch zum Schreiben oder Ändern eines schreibgeschützten Speichers).

    char *str;

    //Stored in read only part of data segment str = "GfG";

    //Problem: trying to modify read only memory *(str+1) = 'n';

  • Versuchen Sie, eine Adresse zu erreichen, die bereits frei ist.

    // allocating memory to num int num = malloc(8); num = 100;

    // de-allocated the space allocated to num free(num);

    // num is already freed there for it cause segmentation fault *num = 110;

  • Stack Overflow -: Kein Speicherplatz mehr auf dem Stack

  • Zugriff auf ein Array außerhalb der Grenzen'.

  • Verwenden Sie falsche Formatangaben bei der Verwendung von printf() y scanf() '

3voto

Betrachten Sie die folgenden Codeschnipsel,

SNIPPET 1

int *number = NULL;
*number = 1;

SNIPPET 2

int *number = malloc(sizeof(int));
*number = 1;

Ich gehe davon aus, dass Sie die Bedeutung der Funktionen kennen: malloc() y sizeof() wenn Sie diese Frage stellen.

Nun, da das geklärt ist, SNIPPET 1 würde einen Segmentation Fault Error auslösen. während SNIPPET 2 dies nicht tut.

Hier ist der Grund dafür.

In der ersten Zeile des ersten Schnipsels wird eine Variable (*Nummer) erstellt, um die Adresse einer anderen Variablen zu speichern, aber in diesem Fall wird sie mit NULL initialisiert. Auf der anderen Seite, In der zweiten Zeile des zweiten Schnipsels wird dieselbe Variable (*Zahl) erstellt, um die Adresse einer anderen zu speichern, und in diesem Fall wird ihr eine Speicheradresse gegeben (weil malloc() eine Funktion in C/C++ ist, die eine Speicheradresse des Computers zurückgibt)

Der Punkt ist Sie dürfen kein Wasser in eine nicht gekaufte Schale geben ODER in eine gekaufte Schale, die nicht von Ihnen benutzt werden darf. Wenn Sie dies versuchen, wird der Computer alarmiert und gibt einen SegFault-Fehler aus.

Dieser Fehler sollte nur bei Sprachen auftreten, die nahe an Low-Level wie C/C++ sind. In anderen Hochsprachen gibt es eine Abstraktion, die sicherstellt, dass Sie diesen Fehler nicht machen.

Es ist auch wichtig zu verstehen, dass Segmentation Fault nicht sprachspezifisch ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X