2017-03-05 12 views
-1

タスクは次のとおりです。なぜ私のコードはセグメンテーションフォルトを引き起こしますか?

/* LAB 6タスクA */

/* 保存配列全体IAによってロードすることができるバイナリ ファイル形式で「ファイル名」と呼ばれるファイルにintarr_load_binary()。成功した場合は を返し、失敗した場合はゼロ以外のエラーコードを返します。 長さ0の配列は、空の配列を含む出力ファイルを生成するはずです。 */

/* LAB 6タスクB */

/* ロード 'ファイル名' という名前のファイルから新しい配列は、それが以前に )(intarr_save_binary用いて保存しました。成功した場合に に新たに割り当てられたintarr_tへのポインタを返します。失敗した場合はNULLを返します。

int intarr_save_binary(intarr_t* ia, const char* filename) 
{ 
    int returnValue = 0; 
    unsigned int len = ia->len; 
    FILE *f; 

    if(NULL == (f = fopen (filename, "wb"))) 
    { 
     perror("fopen failed"); 
     returnValue = 1; 
    } 

    else if (fwrite (&len, sizeof(int), 1, f) == 1) 
    { // then write of length successful 

     if (fwrite (ia->data, sizeof(int), len, f) == len) 
     { 
      returnValue = 0; // indicate success 
     } 

     else 
     { // else, write of data failed 
      returnValue = 3; 
     } 
    } 
    else 
    { // else, failed to write len value to file 
     returnValue = 4; 
    } 

    fclose(f); // cleanup (writes last buffer to file) 
    return(returnValue); 
} 

そしてBのために、私のコードは以下の通りです:

intarr_t* intarr_load_binary(const char* filename) 
{ 
    unsigned int len = 0; 
    FILE *f = NULL; 
    intarr_t* newia = NULL; 

    if(NULL == fopen (filename, "rb")) 
    { // then, fopen failed 
     perror("fopen failed"); 
     exit(EXIT_FAILURE); 
    } // end if 

    // implied else, fopen successful 

    if(NULL == (newia = malloc (sizeof(intarr_t)))){ 
     perror("malloc failed"); 
     fclose(f); 
     exit(EXIT_FAILURE); 
    } // end if 

    // implied else, malloc successful 

    if((fread (&len, sizeof(int), 1, f) != 1)) 
    { // then fread failed 
     perror("fread failed"); 
     fclose(f); 
     free(newia); 
     exit(EXIT_FAILURE); 
    } // end if 

    // implied else, fread for len successful 

    newia->len = len; 

    if(NULL == (newia->data = malloc (len*sizeof(int)))) 
    { // then malloc failed 
     perror("malloc failed"); 
     fclose(f); 
     free(newia); 
     exit(EXIT_FAILURE); 
    } // end if 

    // implied else, malloc successful 

    if(fread(newia->data, sizeof(int), len, f) != len) 
    { // then, fread failed 
     perror("fread failed"); 
     fclose(f); 
     free(newia->data); 
     free(newia); 
     exit(EXIT_FAILURE); 
    } // end if 

    // implied else, fread successful 

    fclose (f); 
    return newia; 
} // end function: intarr_load_binary 

誰もがなぜ私のコードの結果で教えてくださいすることができ、Aは、私のコードは次のようさのために */

セグメンテーション障害?どうもありがとうございました。 B、NULLのコードで

答えて

0

は、それがセグメンテーション障害につながる可能性がラインにfread()

if((fread (&len, sizeof(int), 1, f) != 1)) 

に渡されます。この問題を解決するには

、ファイルポインタはffopen()から返さ割り当てる:
変更

if(NULL == fopen (filename, "rb")) 

if(NULL == (f = fopen (filename, "rb"))) 

への関数に渡されたパラメータが有効である場合も確認してください。

+0

ありがとうございます!私は自分のコードを提出し、その結果をあなたに知らせます。再び、あなたが私を助けてくれて本当に感謝しています!あなたは素晴らしいです! –

+0

同じエラーが再び発生します。 –

+0

これはエラーメッセージです: テストコーナーケース \t intarr_save_binary(NULL、 "foo"); \t ***セグメント違反*** –

関連する問題