2016-05-15 9 views
0

ユーザーが入力する「印刷ジョブ」の優先キューを作成しようとしています。スペースの後に文字列を入力し、ジョブの優先順位として数字(0〜9)を入力します。 "NONE"が入力されると、プログラムは入力を停止し、最終的に優先順位の高い順にジョブを出力するコードを書きます。コードは終了していませんが、すでにセグメント化エラーが発生しています。私は約2時間コードを見つめて、間違ったことは見ない。私はまた、私が問題を把握できるという質問を見つけることができませんでした。私はただ愚かなことをしていると思って、それを見ることはできません。Cのリンクリストの初心者向けセグメント化エラーヘルプ

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

struct node 
{ 
    int priority; 
    char *dataString; 
    struct node *next; 
}; 

struct node *first = NULL; 

int main(void) 
{ 

    char temporaryPriority; 
    int i = 0; 

    while(i != 1) 
    { 
     struct node *newNode = malloc(sizeof(struct node)); 

     if (newNode == NULL) 
     { 
      exit(EXIT_FAILURE); 
     } 

     scanf("%s", (newNode -> dataString)); 

     if ((strcmp((newNode -> dataString), "NONE") != 0) && (strcmp((newNode -> dataString), "none") != 0)) 

     { 
      scanf(" %c", &temporaryPriority); 

      (newNode -> priority) = temporaryPriority; 

      (newNode -> next) = first; 
      first = newNode; 
     } 
     else 
     { 
      i = 1; 
      free(newNode); 
     } 
    } 
    return 0; 
} 
+1

コードを見つめは、一般的に非生産的です。あなたが始めたときと同じように、2時間後に同じように見えます。しかし、デバッガを使用すると、valgrindなどのメモリ解析ツールと同様に、非常に便利なことがよくあります。コードの進捗状況を確認するためにprintf()を追加するだけで、2時間後に問題が発生したことが明らかになりました。初歩的なデバッグのスキルと、それを自分で使う意思があるまで、プログラムの作成をやめてください。 –

+1

あなたは3ヶ月間CSコースを受講しています。今までのトラブルシューティングやデバッグについて教えてもらうために、教授/ TAに教えてください。 –

+0

@MartinJames GCCしかインストールされていないサーバーでプログラムする必要があるため、私は現在デバッガにアクセスできません。私はprintfステートメントを使用していて、コードのセクションを問題を解明する試みとしてコメントアウトしていました。あなたが上に見ているものは、私が見たことのない間違いを解消すると思った書き直し版です。私はまだデバッグについて何も学んでいないし、gdbで始めることを考えていましたが、私はvalgrindも見ていきます。提案していただきありがとうございます。 – Glace

答えて

1

char dataString[50];からchar *dataString;50ちょうど偽の番号を変更してください、あなたはそれがあなたのoccationに応じて定義することができます。

scanf("%s", (newNode -> dataString));を使用していますが、newNode -> dataStringにはメモリを割り当てないためです。

第二の方法: ノードにメモリを割り当てる:

struct node *newNode = malloc(sizeof(struct node)); 
newNode->dataString = malloc(sizeof(char) * 20); 

フリーノードのメモリ:

free(newNode->dataString); 
free(newNode); 
+0

私にそれを指摘していただきありがとうございます。 dataString []がノード内にあるときに動的にメモリを割り当てる方法はありますか? – Glace

+0

@Glaceはい、すでにノード自体が割り当てられているので、あなたはすでにこれを知っています。なぜ、dataString []に対してメモリを割り当てるか尋ねる理由は分かりません。 –

+0

。特に、あなたは3ヶ月以上CSコースを受講しています。 –

関連する問題