2 Stimmen

Segmentationsfehler: Warum?

Ich habe dieses Stück Code, das kompiliert und wie erwartet funktioniert:

#include 

using namespace std;

int fun(int* p){
    *p = 20;
    return 1;
}

int main(){
    int* number;    
    *number =10;

    cout << "before: "<<*number<


Während der folgende zu einem Segmentation-Fehler führt:

    #include 

    using namespace std;

    int fun(int* p){
        *p = 20;
        return 1;
    }

    int main(){
        int test=1; //ADDITION
        int* number;    
        *number =10;

        cout << "before: "<<*number<

``

Ich kompiliere mit `g++ test.cpp -o test`

Kann mir jemand erklären, woher dieses Verhalten kommt?

`` ```

8voto

Mahesh Punkte 33527

number zeigt nicht auf einen gültigen Speicherort in main(). Das Programm hat einfach einen Zeiger namens number deklariert, der eine Adresse vom Typ Integer aufnehmen kann. Aber er wurde nicht auf eine Stelle im Speicher zugewiesen/initialisiert, die auf einen Integer zeigt.

int* number = new int;
*number = 10;

Und da das Programm Ressourcen verwaltet, sollte es diese Ressourcen mit delete zurückgeben.

delete number;

Beide Programme geben einen Segmentation Fault aus, wenn du Glück hast.

7voto

Erik Punkte 85308

In beiden Programmen dereferenzierst du einen nicht initialisierten Zeiger. Im ersten Fall hattest du Glück und es ist nicht abgestürzt.

int* number; // number zeigt auf eine zufällige Stelle - es ist nicht initialisiert
*number =10; // Du schreibst an eine zufällige Stelle

Verwende das hier:

int number;
number = 10;
...
fun(&number);

Oder, allokiere das int mit new:

int * number = new int;
*number = 10;
...
delete number; // immer löschen, was du mit new erstellt hast

2voto

NPE Punkte 462670

Beide Programme haben ein undefiniertes Verhalten aufgrund von int* number, das nicht auf einen gültigen Zeiger initialisiert wurde. Es ist nur Glückssache, dass das eine fehlschlägt, während das andere nicht fehlschlägt. Versuchen Sie es

int* number = new int;

2voto

Nawaz Punkte 339767
int* nummer;    
*nummer =10;

nummer ist ein Zeiger auf int. Sie müssen Speicher reservieren, damit er auf einen gültigen Speicherplatz verweisen kann!

int *nummer = new int;
*nummer = 10;

Jetzt ist es in Ordnung!

1voto

Paul Michalik Punkte 4256

Das Verhalten kommt von Aussagen wie diesen:

int* number;
*number = 10;

Nach dem Dereferenzieren eines nicht initialisierten Zeigers betreten Sie das Land des "undefinierten Verhaltens". Sie machen das weiter im Rest des Programms, aber wie sich das Ganze nach *number = 10 verhält, ist undefiniert. Es könnte funktionieren, es könnte abstürzen, es könnte Ihnen sagen, dass 1 + 1 = 15 oder was auch immer. Einfach ausgedrückt: Sie können nicht auf nicht initialisierte Zeiger dereferenzieren (oder auf die Daten dahinter zugreifen).

Viele Grüße,

Paul

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