2017-04-20 8 views
-1

整数配列を取り、数値順にソートする基本的なソートプログラムを作ろうとしています。 k + 1が配列のサイズよりも大きくなると、ランタイムエラーが発生します。私はif文の最後に|| (a[k + 1] != NULL)、さらに(a[k + 1] == \0)を投げてみましたが、それらはコンパイルされません。任意のヒント?配列を超えたアルゴリズムチェックによるCのランタイムエラー

k < j - sizeof(a[i]) - 1 

時期:

int main(void) 
{ 
    int a[5]; 

    printf("\nWill sort your numbers from lowest to highest!\n"); 

    for (int i = 0; i < 5; i++) 
    { 
     printf("Element %i = ", i + 1); 
     scanf("%d", &a[i]); 
    } 

    int swap; 
    int i = 0; 

    for (int j = 0; j < sizeof(a[i]); j++) 
    { 
     for (int k = 0; k < j - sizeof(a[i]) - 1; k++) 
     { 
      if (a[k] > a[k + 1]) 
      { 
       swap = a[k]; 
       a[k] = a[k + 1]; 
       a[k + 1] = swap; 
      } 
     } 
    } 

    for (int c = 0; c < 5; c++) 
     printf("%d\n", a[c]); 

    return 0; 
} 
+2

'int j = 0; j

+0

'NULL'はヌル*ポインタ*です。"変数(または配列要素)に値がありません "という意味ではありません。 *すべての*配列要素と変数は、初期化されていないかどうかが不確定であっても、値を持ちます。 –

+0

また、あなたの問題にもっと直接関係する 'sizeof(A [i])'は、 'sizeof(int)'に等しい*要素* 'A [i]'のサイズを与えます。通常は「4」に等しい。また、 'sizeof'演算子はバイト*でサイズ*を与えます。したがって、あなたの配列' A 'は 'sizeof(A)'を実行すると20を与えます( 'int'が4バイトの場合)。 'sizeof A/sizeof A [0]'を実行して、配列 'A'の要素数を取得してみてください。 –

答えて

0

代わりの

sizeof(a[i])     # size of an (one) element 

使用

sizeof(a)/sizeof(a[0])  # number of elements (as quotient) 
2

あなたの問題は、あなたがここにsignedunsigned整数が混在しているということですは符号なしです。式全体が符号なしとして評価されます。最初のループでj - sizeof(a[i]) - 1がアンダーフローしているので、あなたは、大きな数(例えば4294967291)になってしまいますので、あなたの条件は、よりのようなものです:境界アクセス(クラッシュ)のうちにつながる

(unsigned)k < 4294967291 

。あなたはそれが0 < -4のようなものですので、ループ条件(すなわちk < 0 - sizeof(a[0]))が偽であることを期待するかもしれない最初は

int main(void) { 
    int a[5]; 

    for (int k = 0; k < 0 - sizeof(a[0]); k++) 
    { 
     printf("k=%d\n", k); 
     if (k == 10) break; // Stop after 10 prints 
    } 

    return 0; 
} 

:これを確認するには

、このコードを検討してください。つまり、何も印刷しないでください!

しかし、それはどういうことではありません。 -4は実際には4294967291(アンダーフロー後)の符号なしの値と見なされるため、ループ条件は実際にはk < 4294967291です。言い換えれば - あなたはたくさん印刷されます。

それを修正するには、試すことができます:

k < j - (int)sizeof(a[i]) - 1 

注:この答えは、32ビットintを前提としています。 intのサイズが異なる場合は、前述の値の一部が異なる場合がありますが、原則は同じです。

+0

あなたのお手伝いをありがとうございます。私はその日の後にそれを理解してしまいました。そうでなければ私が表示するコメントのコード:( – martyworm

関連する問題