2017-11-08 12 views
0

私はポインタとリンクされたリストを作成するのが初めてです。このコードは全体の一部にすぎません。私はこの部分をテストとデバッグのために簡単にしようとしましたが、それでもわかります。与えられたコードを実行した後にプロセスが終了していると誰かが理解できますか?コード実行後にプロセスが終了するのはなぜですか?処理が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; 
    } 
} 

これは、出力は次のようになります。

add funct works 
added cards 

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

なぜそれが255を返していますか?

いずれの方向にも大変感謝します!

**注:私は私の推測では、あなたが

newNode->card->value 

をやっている時にカードがそれほど価値は何であるNULLポインタのメンバーを割り当て、NULLポインタであるということであるC

+1

ファイルの最後の '}'の直前に 'return 0;'を入れてみてください –

答えて

1

Cのポインタがあなたを強くしています:)あなたが初期化していないポインタにアクセスしているため、プログラムがクラッシュしています。

ポインタはオブジェクトへの参照に過ぎないことに注意してください。あなたのケースでは、まず、カードがCardオブジェクトへのポインタであることを、ここで教えてください。

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

しかし、あなたはまだ、実際のカードオブジェクトの位置要するに

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

または

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

よう何かを私たちに語っていない、ポインタが指していることを覚えておいてください存在しないカード!!!最も簡単な解決策は、カードが実際のオブジェクトではないポインタがあるように、あなたの構造体の定義を変更する

newNode->card->value 

ある

あなたは、この実在しないカードにアクセスしようとした瞬間、プログラムがクラッシュした

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

次にあなたがINIことができ、この

newNode->card.value 

もないと同じように使用あなたのカードポインタを使用しようとする前にカードオブジェクトのアドレスでカードポインタを確認してください。

1

に書いていますあなたのプログラムがクラッシュする原因となっています

+0

その値は初期化されていません。 –

+0

ok、私はcard =&BagNodeを追加する必要がありますか?どこに追加しますか? – blazek

+0

いいえ、あなたはmallocカードを持っていなければなりません。 – adrotter

0

OSが突然セグメンテーションフォールトを投げます。なぜなら、無効なアドレスを指す初期化されていないポインタがあるため、メモリ "カード"を割り当てる必要があるからです。

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

と正常に終了()関数のメインの後に、それはあなたのケースでは私の知る限り、そのように失敗して戻って1すなわちその255以外の何ものでもない第2バイトで1を返すとして0または1を返します。

関連する問題