2017-12-08 11 views
1

私のコードは動作しますが、私の質問はこの動的割り当てが正しいかどうかです。それはうまく動作し、すべてが大丈夫ですが、私はそれが正しいと確信していません。この再割り当て方法は正しいですか

 StudentDynamic* pStudents = NULL; 
     char auxfirstName[255], auxlastName[255]; 
     float auxGrade; 
     FILE* pFile = fopen("InitialDB.txt", "r"); 
     if (pFile == NULL) 
     { 
      printf("Could not open file or is empty! Exiting..."); 
      exit(2); 
     } 
     int i = 0; 
     pStudents = (StudentDynamic*)malloc(sizeof(StudentDynamic) * 1); 
     while (!feof(pFile)) 
     { 
      fscanf(pFile, "%s", auxfirstName); 
      pStudents[i].firstName = (char*)malloc(strlen(auxfirstName) + 1); 
      strcpy(pStudents[i].firstName, auxfirstName); 

      fscanf(pFile, "%s", auxlastName); 
      pStudents[i].lastName = (char*)malloc(strlen(auxlastName) + 1); 
      strcpy(pStudents[i].lastName, auxlastName); 

      fscanf(pFile, "%f", &auxGrade); 
      pStudents[i].grade = auxGrade; 

      i++; 
      pStudents = (StudentDynamic*)realloc(pStudents, sizeof(StudentDynamic) * (i + 1)); 
     } 
     nStudents = i; 
     fclose(pFile); 
+2

[malloc()の返り値をC言語でキャストしない理由についてのこの記事を参照してください。](https://stackoverflow.com/q/605845/2173917) –

+2

"while(!feof(file))"常に間違っていますか?(https://stackoverflow.com/q/5431941/2173917) –

+0

malloc + strcpyの代わりに 'strdup'を使用してみませんか? –

答えて

1
temp_pStudents = realloc(pStudents , sizeof(StudentDynamic) * (i + 1)); 
if (!temp_pStudents) 
    // error 
pStudents = temp_pStudents ; 

理想的には、これはこのようなものになるだろう。それ以外の場合は、メモリリークが発生しました。また、これにより、ヌルポインタの逆順化が軽減されます。

ここでも他のものは必要ありませんmallocをキャスト

  • が含まれます。
  • while(!feof(file))のコンストラクトを使用してください。それを使用しないでください。コメントに投稿されたディスカッションを確認してください。
+0

temp_pStudentsどのように宣言する必要がありますか? – Bogdy

+0

@Bogdy: 'StudentDynamic * temp_pStudents'。 – coderredoc

+0

今私はクラッシュする..あなたがしたいかどうかを確認できますか? https://pastebin.com/kFGLRN54 – Bogdy

関連する問題