2016-10-31 12 views
0

必要なサイズをスキャンした後、ユーザーから整数をスキャンしようとしています。 私はvalgrindを使って計算したコードの一部を表しています(valgrindのエラーは「サイズが4の無効な書き込みです」)。メモリリークは、メインの下の関数によって引き起こされます。 問題は、ユーザーがサイズを入力してから、宣言されたより多くのデータを入力したときに発生します。例えば、SIZE = 8とDATA = 1 2 3 4 5 6 7 8 9 10、私のコードは余分なデータを無視します私はそれをデバッグしようとしていますが、最初のフリーコマンドになるとクラッシュします。Cプログラムでメモリリークを理解する

私は本当になぜそれが起こるのかわかりません、あなたはそれで私を助けることができますか?

int main() 
{ 
    int size = 0; 
    int* user_numbers_array = (int*) malloc(size * sizeof(int)); 
    int* second_array = (int*) malloc(size * sizeof(int)); 

    printf("Enter size of input:\n"); 
    scanf("%d", &size); 

    ScanNumbersFromUser(size, user_numbers_array) 

    free(user_numbers_array); 
    free(second_array); 

    return 0; 
} 

int ScanNumbersFromUser(int size, int* user_numbers_array) 
{ 
    int user_number = 0; 
    printf("Enter numbers:\n"); 
    for(int i = 0; i < size; i++){ 
     if(scanf("%d",&user_number) =! 1){ \\testing for valid input 
      printf("error"); 
      return 0;  
     } 
     *(user_numbers_array + i) = user_number; 
    } 
return 1; 
} 
+4

サイズが「0」のメモリを割り当てた後、なぜ「サイズ」を取得していますか?あなたはサイズを取得した後にメモリを割り当てることは理にかなっていませんか? –

+1

「無効な書き込み」は、メモリリークが発生していないことを意味します。無効な書き込みははるかに深刻な問題です。 –

+0

あなたは1つの '\\有効な入力をテストしていますが、2つの問題があります:1.' \\ 'をコメントするのは' // 'ではありません2.他の 'scanf()'はチェックしていません。また、スペースバーが詰まっていて、動作しないか、動作しません。ほとんどの場合、正しく使用されます。 –

答えて

4

あなたはmallocは、ユーザーのサイズを得ている前に配列をエドました!あなたの配列のサイズは0です。

関連する問題