2017-11-08 2 views
0

Ich bin neu in Pointern und Erstellen von verknüpften Listen. Der Code ist nur ein Teil der gesamten Sache. Ich habe versucht, diesen Teil zum Testen und Debuggen einfacher zu machen, aber ich kann es immer noch herausfinden. Kann mir jemand helfen, herauszufinden, dass der Prozess beendet wird, nachdem er den angegebenen Code ausgeführt hat?Warum wird der Prozess beendet, nachdem mein Code ausgeführt wurde? Prozess liefert 255

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <math.h> 

#define SPADE "SPADE" 
#define CLUB "CLUB" 
#define DIAMOND "DIAMOND" 
#define HEART "HEART" 

typedef struct Card{ 
    int value; 
    char suit[10]; 
}Card; 

typedef struct BagNode { 
    Card* card; 
    struct BagNode* next; 
}BagNode; 

int main() { 

    BagNode* head = NULL; 
    BagNode* tail = NULL; 

    const char* suit = SPADE; 
    int value = 6; 


    if(tail == NULL) 
    { 
     printf("add funct works\n"); 
     BagNode* newNode = (BagNode*)malloc(sizeof(BagNode)); // allocate space 
     newNode->card->value = value;         // assign value 
     strcpy(newNode->card->suit, suit);      // assign value 
     head = newNode; 
     tail = newNode; 
     printf("added cards\n"); 
    } 
    else{ 
     BagNode* newNode = (BagNode*)malloc(sizeof(BagNode)); // allocate space 
     newNode->card->value = value;         // assign value 
     strcpy(newNode->card->suit, suit);      // assign suit 
     tail->next = newNode; 
     tail = newNode; 
    } 
} 

Dies ist, was die Ausgabe wie folgt aussieht:

add funct works 
added cards 

Process returned 255 (0xFF) execution time : 6.898 s 

Warum ist es Rückkehr 255?

Jede Richtung würde sehr geschätzt werden!

** Anmerkung: Ich bin in C schreiben

+1

Versuchen Sie, 'return 0;' vor dem letzten '}' der Datei zu setzen –

Antwort

1

C Zeiger sind Ihnen mein Freund Strafe :) Ihr Programm stürzt ab, weil Sie auf einen Zeiger zugreifen, die Sie nicht initialisiert haben, so dass das Objekt, auf das es zeigen soll, nicht existiert.

Denken Sie daran, dass ein Zeiger nur ein Verweis auf ein Objekt ist. In Ihrem Fall sagen Sie uns zuerst, dass die Karte hier ein Zeiger auf ein Kartenobjekt ist.

typedef struct BagNode { 
    Card* card; 
    struct BagNode* next; 
}BagNode; 

Aber denken Sie daran, dass Sie haben uns noch nicht gesagt, die Lage der tatsächlichen Karten Objekt So etwas wie

Card mycard; 
newNode->card=&mycard;//pointer equals to address of mycard 

oder

newNode->card=(Card*)malloc(sizeof(Card));// works because now there is an actual memory location pointed at. 

Kurz gesagt, der Zeiger zeigt auf eine nicht existierende Karte !!!

In dem Moment, Sie versuchen, diese nicht vorhandene Karte zuzugreifen, stürzt das Programm

newNode->card->value 

Die einfachste Lösung ist die Definition Ihrer Struktur zu ändern, so dass Karte ist das eigentliche Objekt kein Zeiger

typedef struct BagNode { 
    Card card;//actual object not the pointer to an object 
    struct BagNode* next; 
}BagNode; 

verwenden Sie es dann so

newNode->card.value 

Oder sonst kann man ini Talisiere deinen Kartenzeiger mit der Adresse eines Kartenobjekts, bevor du versuchst, es zu benutzen.

1

Meine Vermutung ist, dass, wenn Sie

newNode->card->value 

Karte tun ist ein Null-Zeiger, so dass ein Null-Zeiger-Mitglied Zuweisung ein Wert ist, was verursacht Ihr Programm zum Absturz

+0

Ihr Wert ist nicht initialisiert. –

+0

ok, also muss ich Karte = & BagNode hinzufügen? Wo füge ich es hinzu? – blazek

+0

Nein, Sie müssen Malloc-Karte – adrotter

0

OS wirft Segmentierung Fehler, weil Sie Speicher "Karte" zuweisen sollten, da es ein nicht initialisierter Zeiger auf eine ungültige Adresse verweist.

so for this add this line : 
       newNode->card=malloc(sizeof(Card)); 
    before this line 
       newNode->card->value = value; 

und nach main (Funktion erfolgreich abgeschlossen), es 0 oder 1 zurück, wie meines Wissens in Ihrem Fall seine weil es seine so den Wert 1 zurück heißt seine 1 in 2. Byte zurückkehrt, die nichts anderes als 255 ist.

Verwandte Themen