2016-10-23 13 views
0

なぜコードがdev C++のクラッシュを引き起こすのか教えてください。fscanfがループ内で呼び出された後にDev C++がクラッシュする

FILE* input; 
int k=0; 
char filename[]=""; 
int* Tab=NULL; 
printf("Please specify the filename you want to open and read\n"); 

    scanf("%s",&filename); 

//strcat(filename,".txt"); 
input=fopen(filename,"r"); 
if(input==NULL) 
{ 
    printf("File open error"); 
    } 

fscanf(input,"%d",&total); 
Tab=malloc(total); 
for(k=0;k<total;k++)// here is my problem 
{ 
    fscanf(input,"%d",&Tab[k]); 
    } 

ファイルが正常に開かれ、最初のatemptで読み込みが正しく行われた後、クラッシュが開始されました。変数totalも読み取ることができ、次のforループが問題になります。

お願いします。

+2

'' char型のファイル名[] =「」; ''あなたは、入力されたファイル名は、この変数に収まるどう思いますか? – BitTickler

+0

ファイル名が正常に動作し、デバッグでSIGSEGV信号が発生し、セグメンテーションの問題が発生します。だから問題はファイル名ではないと思う。 –

+1

メモリをオーバーウィート(スタック)した後、コード内で次に起こることの賭けはすべてオフになります。あなたのファイル名はメモリを上書きします。 – BitTickler

答えて

2

コメントはすべて1つのことを示しています。コンパイラがメモリを処理すると思います。

そうではありません! Cでは、すべてのメモリの取り扱いは、あなたが行わなければなりません:あなたは、1バイトの配列(のみ'\0')を宣言していますがscanf("%s",&filename);は魔法のように多くを保持することができるように増加するものと考えて

  • char filename[]="";に長いファイル名。そうではありません! (文字配列になぜ&?)

    Tab=malloc(total);
  • あなたは、コンパイラはあなたがTabに格納する要素の大きさを知っていると思います。そうではありません!

すべてのコメントで、小さな変更を行い、「ダン!それでも動作しません」もちろん、Cコンパイラがメモリ処理をしていないことを理解していないので、そうではありません。私はあなたが再び本を読むことをお勧めします:グローバル変数、静的変数、自動変数について読む。配列と文字列について読んで、mallocreallocおよびfreeについて読んでください。

(これは解決策よりもコメントです)

関連する問題