-2

ファイルを閉じようとした場合にのみ、セグフォルトが発生し続けます。

   FILE *outFilePtr = fopen(*(argv + 2), "w"); //open file, yes i'm sure it opens


   fclose(outFilePtr); //sometime later in the program.

プログラムは flcose() なしで最初から最後まで実行されます。助言がありますか?

gdb リダイレクトのエラーは次のとおりです。すべての変数が宣言された関数であると仮定します。また、gdb は私が使っていない strtol のせいです。

 int t;
     char line[50];

          for (t = 0; t < lines; t++){
              fgets(line, 50, filePtr);
             strcpy(*string[t], strtok(line, " "));
              *(num1 + t) = atoi(strtok(NULL, " "));
              *(num2 + t) = atoi(strtok(NULL, " "));
           }

メモリ割り当て機能

 void dynamicArray(int** num1, int** num2, char*** str, int size)
 { 
     int i = 0;

*(num1) = (int*)malloc(sizeof(int) * size);
*(num2) = (int*)malloc(sizeof(int) * size);

*(str) = (char**)malloc(sizeof(char*) * size);

for( i = 0; i < size; i++){
    *(*(str) + i) = (char*)malloc(sizeof(char) *size);
}

return;
 }
4

3 に答える 3

1

outFilePtr念のため、 null でないことを確認してください。

if (outFilePtr) {fclose(outFilePtr); outFilePtr = NULL;}

私は常にファイルを閉じるときにそれを行い、ポインタを NULL に置いて、同じファイルを 2 回閉じようとしないようにします (これも問題を引き起こす可能性があります)。

しかし、ほとんどの場合、原因はメモリリークまたは未定義の動作であり、混乱を招き、segfault はfclose().

于 2013-02-18T17:12:03.700 に答える
1

私の推測では、fclose() に到達したときに outFilePtr の値が保持されていないということです。

コード スニペットが短すぎて、他の重要な要素を見逃しています... 文字列と num2 とは何ですか。割り当てられる大きさ。等...

また、*(num2 + t) への最初のストアは、2 番目の *(num2 + t) によって上書きされます。

また、ARRAYS.... も見てください。num2[t] は *(num2+t) よりもはるかに読みやすく、同じ仕事をします。

于 2013-02-18T17:12:41.157 に答える
1

あなたの恐ろしい配列アクセス構文を除いて。入力文字列行を複製するのを忘れました。はstrtok常に、すべての行で変化する同じバッファーを指します。

 int t;
 char line[50];

      for (t = 0; t < lines; t++){
          fgets(line, 50, filePtr);
          strings[t] = strdup(strtok(line, " ")));
          num1[t]    = atoi(strtok(NULL, " "));
          num2[t]    = atoi(strtok(NULL, " "));
       }

割り当てコードでは、50 バイトではなく 5 バイトのみを割り当てます。実際に 5 バイトしか割り当てていない場合は、ヒープを破壊し、これは頻繁にクラッシュすることで明らかになりますfclose

void dynamicArray(int** num1, int** num2, char*** str, int size)
{ 
int i = 0;

*num1 = malloc(sizeof(int) * size);
*num2 = malloc(sizeof(int) * size);

*str = malloc(sizeof(char*) * size);

for( i = 0; i < size; i++)
  (*str)[i] = malloc(50);      /* sizeof (char) is by definition 1 */

return;
}
于 2013-02-18T17:26:15.753 に答える