2016-05-31 8 views
-4

Ich schaffe eine Prioritätswarteschlangenstruktur in C.Segmentierungsfehler in einfache Zuordnung

der Struktur:

#define MAXCOUNT 10 
typedef int array[MAXCOUNT+1]; 

typedef struct { 
    int Count; 
    array items; 
} PriorityQueue; 

Die Initialisierungsfunktion:

void Initialize(PriorityQueue *PQ) 
{ 
    PQ->Count=0; 
} 

Der Haupt:

int main (void) { 
    PriorityQueue* PQ; 
    Initialize(PQ); 

    Insert(2, PQ); 
    Insert(3, PQ); 
    Insert(5, PQ); 
    Insert(1, PQ); 
    Insert(12, PQ); 
    Insert(6, PQ); 
    Insert(10, PQ); 

    printPQ(PQ); 

    return 0; 
} 

Das Problem ist, whe Wenn ich es starte, bekomme ich einen Segmentierungsfehler. Mit gdb habe ich herausgefunden, dass es auf die Initialisierungsfunktion geworfen wird. Es verwirrt mich, wie eine einfache Zuweisung eines int einen Segmentierungsfehler werfen könnte.

+3

Wir brauchen wirklich ein kanonisches Duplikat für "Ich versuche, Sachen durch einen nicht initialisierten Zeiger zu speichern". Wäre schön, wenn wir diese FAQ sofort schließen könnten.Ich werde versuchen, ein Community-Wiki zu erstellen. – Lundin

+3

Tun Sie sich und allen einen Gefallen: ** immer ** kompilieren mit 'gcc -Wall -Werror'. –

+2

Wow ... Danke für die Köpfe, aber keine Notwendigkeit, dieser harsche Kumpel zu sein. Tut mir leid, wenn diese Frage die Community ruiniert hat, ich dachte nur, dass SO ein Forum war und die Leute meistens wegen Problemen zu den Foren kommen. :/ – Drunky

Antwort

2

Es verblüfft mich, wie eine einfache Zuweisung von int einen Segmentierungsfehler auslösen könnte.

Nun, schau vorher !!!

In Ihrer Initialize() Funktion, wenn Sie versuchen, PQ zugreifen zu können, ist es nicht ein gültig Speicher zugewiesen. Sie müssen PQ den richtigen Speicher zuweisen, bevor Sie es deaktivieren. Andernfalls wird beim Versuch, auf einen ungültigen Speicher zuzugreifen, undefined behavior aufgerufen.

+0

Ja, das war es. Es tut mir schrecklich leid, dass ich so eine neue Frage gestellt habe, aber ich steckte jetzt seit etwa einer Stunde auf dieser Segmentierungsfehler. Wie auch immer, viel Glück für Sie. – Drunky

+3

@Drunky, wenn dies Ihnen geholfen hat, drücken Sie bitte die Taste und akzeptieren Sie die Antwort. Und bedenken Sie, dass Sie für nur eine Stunde auf einem Segfault stecken bleiben müssen, um eine kurze Zeit zu sein. –

0

Erklärung:

PriorityQueue* PQ; 

deklariert eine Variable (dessen Typ und den Namen, und indirekt in Erinnerung seiner Position), aber tut nicht es initialisieren. Also, wenn Sie den Wert mit

Initialize(PQ); 

die aufgerufene Funktion verwendet einen Zufallswert als Adresse an den Speicher übergeben - die Zuordnung

PQ->Count=0; 

Null in beliebige Speicherstelle setzt, zum Glück für Sie in ungültige/verboten Lage.

0

Schreiben Sie stattdessen PriorityQueue PQ; (d. H. Den Zeigertyp löschen) und verwenden Sie &PQ in jeder anderen Instanz in main. Die Verwendung einer automatischen Variablen für die Prioritätswarteschlange ist in diesem Fall ausreichend.

Andernfalls müssen Sie Speicher zuweisen (mit malloc & c.), Weisen Sie den Speicherort dieses Speichers zu PQ, und denken Sie daran free zu rufen, wenn Sie fertig sind.

0

Der Prioritätsqueue-Variable PQ ist kein Speicherplatz zugewiesen. Der Grund für den Segmentierungsfehler ist, dass Sie versuchen, eine Variable in einem nicht zugewiesenen Speicherplatz (oder auf dem Speicherort, auf den Sie nicht zugreifen dürfen) zu speichern. Um Speicherplatz für die Variable PQ zu erhalten, verwenden Sie die Funktion malloc().

PQ = (PriorityQueue*) malloc(sizeof(PriorityQueue));