2016-11-14 8 views
1

私はリンクされたリストに非常に慣れていて、少し助けが必要です。現在、私はこのエラーを」受け付けておりますCリンクされたリスト:アクセス違反の読み取り場所0x00000001

ConsoleApplication1.exeで0x0FD940C1(msvcr120d.dll)で

未処理の例外:0xc0000005で:アクセス違反読み取り場所 0x00000001の

プログラムがやろうとしている何

。ファイルを取ってそれを反復し、リンクされたリストを作成します。各ノードは文字列値と次のノードへのノードポインタで構成されています。複数のチュートリアルに従っていますが、それは素晴らしいでしょう。

以下は私のコードです:

#ifdef _WIN32 
#define _CRT_SECURE_NO_DEPRECATE 
#endif 

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

#define BUFF_SIZE 300 

typedef struct node { 
    char stringDat[BUFF_SIZE]; 
    struct node* next; 
} NODE; 

int main(int argc, char** argv) { 
    FILE* fp; 
    FILE* fpLogFile; 

    char* fileLoc = "C:\\Users\\David\\Desktop\\data.dat"; 
    char* logFile = "C:\\Users\\David\\Desktop\\log.txt"; 

    char buff[BUFF_SIZE]; 
    int i, nodeCnt; 

    if ((fp = fopen(fileLoc, "rb+")) == NULL) { 
     printf("FILE OPEN ERROR ON EXISTING FILE\n"); 
     exit(1); 
    } 

    if ((fpLogFile = fopen(logFile, "w")) == NULL) { 
     printf("Error opening log file\n"); 
     exit(1); 
    } 

    // root node 
    NODE* root = NULL; 

    // provide memory for root node 
    root = malloc(sizeof(NODE)); 
    if (root == NULL){ 
     return 1; 
    } 
    fprintf(fpLogFile, "%s\n", "ROOT MALLOC"); 
    nodeCnt = 1; 

    // assign values to root node 
    root->next = NULL; 
    fprintf(fpLogFile, "%s\n", "ROOT Next = 0"); 

    strcpy(root->stringDat, fread(buff, 20, 1, fp)); 
    fprintf(fpLogFile, "%s\n", "ROOT buff"); 

    // set curr to root node 
    NODE* curr = root; 
    fprintf(fpLogFile, "%s\n", "Curr = ROOT"); 

    while (fread(buff, 20, 1, fp) != NULL) { 

     // navigate to last node in list 
     while (curr->next != NULL) { 
      curr = curr->next; 
     } 

     fprintf(fpLogFile, "%s\n", "Curr = last node"); 

     // Create node at end of list 
     curr->next = malloc(sizeof(NODE)); 
     fprintf(fpLogFile, "%s\n", "Malloc new Node"); 
     nodeCnt++; 
     // move current node to last node 
     curr = curr->next; 

     if (curr == 0) { 
      fprintf(fpLogFile, "%s\n", "Out of memory"); 
      return 0; 
     } 
     // assign val to current stringDat 
     strcpy(curr->stringDat, buff); 

     fprintf(fpLogFile, "%s  %d %p %d\n", curr->stringDat, strlen(curr->stringDat), curr->next, nodeCnt); 

     for (i = 0; i < BUFF_SIZE; i++) { 
      buff[i] = 0; 
     } 


    } 

    while ((curr = root) != NULL) { // set curr to head, stop if list empty. 
     root = root->next;   // advance head to next element. 
     free(curr);    // delete saved pointer. 
    } 

    fclose(fp); 
    fclose(fpLogFile); 

    return 0; 

} 
+0

エラーが何行で発生しますか? –

+0

わかりません。エラーメッセージには含まれていません。そのため、fprintfをすべてログファイル経由でデバッグする作業を開始しました。しかし、私はファイルを読み込めるようになったことを知っています。それは、すべてのノードが狂っていることを追加し始めたときです。 – Dpry12

+0

デバッガは正確にどこにあるのかを教えてください... –

答えて

3

この:

strcpy(root->stringDat, fread(buff, 20, 1, fp)); 

は意味をなさない、とコンパイラの警告をトリガしている必要があります。

strcpy()の2番目の引数は文字列ポインタですが、fread()size_t(読み込みに成功した要素の数)を返します。ここで成功すると、エラーが表示される1が返されます。

あなたが意味:

if(fread(buff, 20, 1, fp) == 1) 
    strcpy(root->stringDat, buff); 
+0

意味があり、答えです、ありがとう助けのトン!もう1つ、76行目に新しいノードインスタンスがmalloc'ingされていますが、「Out of memory」エラーチェッカーでヒットしています。私はmemを割り当て、次に新しいノードに移動しますが、それは私の新しいノード== 0 ....任意のアイデアですか? – Dpry12

+1

@ Dpry12あなたの質問に対するEugene Sh。のコメントを参照してください。 –

+0

@DavidSchwartzうん、それは私が現在のノードに値を割り当てる前に、次のノードに移動していたという事実でした!助けてくれてありがとう – Dpry12

関連する問題