3

一部のCコードを正しく実行するのに問題があります(Cを初めて使用するため、この質問がばかげている場合はご容赦ください。さらに、誰もが明確に理解できるように、これは実行に問題のあるコードです。唯一の部分は'書いたのはnullファイルハンドルチェックです)。基本的に、私のプログラムはでクラッシュしfcloseます。最初のコード:

ファイルの先頭:

int *label;

メソッド固有:

void load_dat ()
{
  int    i, j, t, k;
  FILE   *in;
  char   t_file[16];

  printf ("\nName of Raw Data File > ");
  scanf ("%s", t_file);
  in = fopen (t_file, "r");
  if (in == NULL){
    perror("fopen error");
  }
 fscanf (in, "%d %d %d", &num_pats, &a_length, &b_length);

 dpt = (float **) malloc (sizeof(float *)*num_pats);

 for (k=0; k<num_pats; k++){
    dpt[k] = (float *) malloc (sizeof(float)*(a_length+b_length));
 }

 label = (int *) malloc (sizeof(int)*num_pats);

  for (i=0; i<num_pats; i++)
  {
      for (j=0; j<a_length; j++)
      {
        fscanf (in, "%f", &dpt[i][j]);
      }

  fscanf (in, "%d", &label[i]);


  if (label[i]<0 || label[i]>3)
    printf ("ERROR: Label corrupted.\n");

    for (t=0; t<b_length; t++){
        dpt[i][t+a_length] = 0.0;
        dpt[i][label[i]+a_length] = 1.0;
    }
  }
  fclose (in); 
}      

プログラムからの私のエラーメッセージは次のとおりAbort trap: 6です。これをグーグルで検索すると、最終的に私が使用するという提案が出され、次のようGBDになりました。

Program received signal SIGABRT, Aborted.

#0  0x00007fff8c12582a in __kill ()
#1  0x00007fff871a3b6c in __abort ()  
#2  0x00007fff871a0070 in __stack_chk_fail ()
#3  0x000000010000175f in load_dat ()
#4  0x0000000100001baa in main ()
#5  0x00000001000013e4 in start ()

メソッド全体をステップスルーすると、最終行に到達するまでプログラムはクラッシュしませんfclose(in)。また、の値inはプログラム全体で同じです。

の問題を検索して、このSO投稿fcloseに出くわしました。これにより、を使用してみることになりました。その出力(using )は次のとおりです。Valgrind--leak-check=yes

==22688== 
==22688== Process terminating with default action of signal 6 (SIGABRT)
==22688==    at 0x2DD82A: __kill (in /usr/lib/system/libsystem_kernel.dylib)
==22688==    by 0x18A06F: __stack_chk_fail (in /usr/lib/system/libsystem_c.dylib)
==22688==    by 0x10000175E: load_dat (in ./dataPre) 
==22688==    by 0x100001BA9: main (in ./dataPre)
==22688== 
==22688== HEAP SUMMARY:
==22688==     in use at exit: 28,781 bytes in 83 blocks
==22688==   total heap usage: 84 allocs, 1 frees, 32,877 bytes allocated
==22688== 
==22688== LEAK SUMMARY:
==22688==    definitely lost: 0 bytes in 0 blocks
==22688==    indirectly lost: 0 bytes in 0 blocks
==22688==      possibly lost: 0 bytes in 0 blocks
==22688==    still reachable: 28,781 bytes in 83 blocks
==22688==         suppressed: 0 bytes in 0 blocks
==22688== Reachable blocks (those to which a pointer was found) are not shown.
==22688== To see them, rerun with: --leak-check=full --show-reachable=yes
==22688== 
==22688== For counts of detected and suppressed errors, rerun with: -v
==22688== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Abort trap: 6

この時点で、私はどこを見るべきか、何をすべきかについて途方に暮れています。

サンプルデータ:

44  96  3                                                                                                                                                                                                                                                                                                                                                                                       
0   0   17.57298681 24.18012088 0   24.07599728 0   0   0   19.53417371 22.61467731 15.5650829  18.65720893 21.70631048 26.8811321  23.88086356 23.73544942 0   0   22.63088094 21.11777268 22.06847477 22.38688445 19.6794802  20.95594497 22.56472976 15.5058779  0   16.89366861 21.23974633 0   19.01608872 22.58492673 22.39564384 18.17000387 0   0   25.85404904 23.80483437 22.64271243 0   17.09819014 24.60634479 0   24.74696139 29.27117194 20.8931952  19.08648917 23.95167438 0   0   17.2386599  0   0   23.22304254 22.86712074 0   21.45687449 21.45146304 0   0   0   20.98717232 0   18.09871479 17.8226754  23.72508288 23.34563846 21.26201041 17.44038043 22.49848573 18.99848797 16.43222002 14.8132735  22.28093734 17.78931496 0   20.46914933 17.87742323 21.07936723 23.52102135 0   17.90498094 21.93199281 0   0   16.3020812  0   18.17972854 16.43234906 19.0756696  0   0   22.98048214 23.22184013 21.54024161 0

num_patsこれは、行数、列数を指していることに注意してくださいa_lengthb_length異なる入力タイプの数(各行の最後の数)です。サンプルファイルには44行あります。

4

3 に答える 3

4

t_fileにロードされる文字列のサイズはどれくらいですか?そこには16バイトしか割り当てません...

于 2012-09-12T17:08:39.850 に答える
0

「num_pats」に対していかなる種類の検証も行っていません。

何らかの理由でfscanfが失敗した場合、num_patsはゼロまたは負の値に等しい可能性があり、これにより中止が発生します。

于 2012-09-12T16:56:56.550 に答える
0

ほぼ確実に、この問題は、割り当てられていないメモリへの書き込みが原因で発生します。関係する操作はFILE *inうまく見えます。

ただし、動的メモリの管理はかなり複雑です(新人は気にしないでください。これは、高度なCプログラマーにとっても複雑なコードです)。失敗した割り当てと入力の有効性の検証チェックがないため、おそらくこれらの割り当ての1つは、割り当ての終わりを書き留めています。割り当てが十分に大きくないか、参照解除の方法が元の割り当てと一致していません。 、キャストを使用する際の問題。そのような書き込みは、それが最終的に呼び出されたときにクラッシュにFILE *inつながることで明らかに何かを台無しにしています。fclose()しかし、問題はずっと前に発生しfclose()ます。

クラッシュの原因となるサンプル入力データを含めると、何が問題になっているのかがわかります。

于 2012-09-12T17:01:50.720 に答える