2016-12-17 10 views
1

これは、10アレイの最小要素と最大要素を検出する簡単なプログラムです。なぜ私がセグメンテーションフォールト(コアダンプ)エラーを受け取っているのか分かりません。C - この簡単なプログラムでセグメンテーションフォールト(コアダンプ)エラーが発生する

#include <stdio.h> 

int main(void) { 
    int i, j, min, array[10], max, n; 

    //This loop get user input for the elements of the array 
    for(i = 0; i < 10; i++) {     
     printf("Enter element number %d:", i); 
     scanf("%d", &n); 
     array[i] = n; 
    } 

    min = array[0]; 
    max = array[0]; 

    //This loop finds the smallest element of the array 
    for(j = 0; j < 10; j++) { 
     if(min > array[j]) { 
      min = array[j]; 
     } 
    } 

    //This loop finds the largest element of the array 
    for(j = 9; j >= 0; j++) { 
     if(max < array[j]) { 
      max = array[j]; 
     } 
    } 

    printf("smallest value is: %d", min); 
    printf("largest value is: %d", max); 

    return 0; 
} 
+0

あなたの答えはあなたのエラーであると言われましたので、私は別のことを尋ねます:二次的な時間ではなく、最小値と最大値を見つけるのに線形時間を使う方法を見つけてみてください。 –

+0

@MeikVtuneここには2次的なものは何もありません... 2つではなく1つの走査を意味しますか? – Quentin

+0

@Quentin Yes :) –

答えて

4
for(j = 9; j >= 0; j++) 

あなたが最初に最後の反復処理したい場合は

for(j = 9; j >= 0; j--) 

でなければなりません。範囲外の2番目の反復でarray[10]にアクセスします。

はまた、最初に最後から反復する理由はありませんので、

for(j = 0; j < 10; j++) 

も働くだろう。

forループ全体(stdinからの読み取り、最小より大きいか小さいかを調べる)でジョブ全体を実行できるので、配列は必要ありません。

1
for (j = 9; j >= 0; j++) 

ここから9から始まり、j ++を実行します。

は、次の操作を行います。

for (j = 9; j >= 0; j--) 

をところであなたは、以下のこの

scanf("%d", array + i); 
0

ループが割り当てられたメモリ空間を超えている場所を指すようにしようと行うことができます。

for(j = 9; j >= 0; j++) 

代わりに書き込みをしてみてください。

for(j=9; j >= 0; j--) 

あなたがしたい場合は、@mchにより示唆されるように、インクリメントループ、のために行くことがあります。 また、提案として、変数jをここでスキップしてください。代わりにiを使用できます。あなたはループで0を割り当てているので、問題はありません。あなたは4つの貴重なバイトを節約します。

関連する問題