2017-10-20 18 views
-1

私はCのスターターであり、ちょうどプログラミングの基礎を学んだだけです。私がコーディングを練習したとき、予期せぬ出力について何か不思議なことに気がつきました。私はその理由を知らず、問題の内容を説明することすらできません。Cコード - 出力が私のコードで予期しない値を返したのはなぜですか?

#include "stdio.h" 
#include "stdlib.h" 
#include "string.h" 

int main() 
{ 
    int numberEntered = 0; 
    int index = 0; 
    char input[32]; 
    int TotalNum = 0; 
    int x = 1; 
    int array[x]; 

    printf("Please enter the size of the array: "); 
    fgets(input,32,stdin); 
    x = atoi(input); 

    for(index =0; index < x; index++) 
    { 
     printf("\nPlease enter your number:"); 
     fgets(input,32,stdin); 

     numberEntered = atoi(input); 
     printf("The number you entered is : %d\n",numberEntered); 


     array[index] = numberEntered; 

     TotalNum ++; 
    } 

    for(index = 0; index < TotalNum; index++) 
    { 
     printf("array[%d] = %d\n",index,array[index]); 
    } 
    return 0; 
} 

ユーザ入力にx = 15;ユーザーは1から15までの数字を入力します。 出力されました:

array[0] = 1 
array[1] = 2 
array[2] = 3 
array[3] = 4 
array[4] = 5 
array[5] = 6 
array[6] = 7 
array[7] = 668977 
array[8] = 9 
array[9] = 10 
array[10] = 11 
array[11] = 12 
array[12] = 13 
array[13] = 14 
array[14] = 15 

私はもともと数が「8」は、ユーザーが入力した内容であるため、配列は[7]、私の配列[7] = 8の出力を与える必要があることを期待しています。しかし、それは乱数に変わった。私はその理由を知りたいです。

+2

'int型のx = 1を大きな値を取得しようとしているとき。 int array [x]; ' - 配列を作成するときの大きさはどれくらいですか?後で 'x'を変更しても、配列は魔法のように成長しません。 –

答えて

3
int x = 1; 
int array[x]; 

printf("Please enter the size of the array: "); 
fgets(input,32,stdin); 
x = atoi(input); 

この行はxの値ではなくarrayのサイズを変更します。宣言されたときにのみ配列にサイズを与えることができます。次へ*)

並べ替え、これを:サイドノートで

printf("Please enter the size of the array: "); 
fgets(input,32,stdin); 
int x = atoi(input); 
int array[x]; 

atoi()はエラーを(あなたは対話型入力で行う必要があります)チェックするために良いではありません。代わりにstrtol()を使用し、the manpageを必ず読んでください。すべての可能性を利用してエラーを検出してください。


*)ここで使用している機能は可変長配列(VLA)と呼ばれているが、単語「変数は」唯一の配列のサイズが、コンパイルではないことを意味します時定数ではないは、配列が存在すると、の動的配列になります。malloc()realloc()を使用してCで実装する必要があります。

また、VLAは非常に普及していますが、にはがサポートされていません.C11はオプション機能です。あなたはのVLAが使用できない場合、あなたは十分に大きい固定サイズの配列のいずれかを使用するか、自分でmalloc()を使用して配列を割り当てる必要があり、この場合には、それは次のようになります。

int x = atoi(input); 
int *array = malloc(x * sizeof *array); 

NULLためarrayをチェックすることを忘れないでください あなたがそれを完了したときこれを行うとfree(array);を忘れないでください。

1

Huh?

あなたがこれを行うとき:

int x = 1; 
int array[x]; 

をあなたはarrayと呼ばれる1要素の配列を取得します。後でxの値を変更しても、配列のサイズを魔法のように変更することはありません。の後にarray[x]宣言を入れて、適切な値をxにします。

I/Oコールのチェックを追加すると、失敗する可能性があります。

0
int x = 1; 
int array[x]; 

あなたの配列のサイズを制限します。このようにしないでください。

0

何ですか?

int x = 1; 
    int array[x]; 

    // ..... 

    x = atoi(input); 

は、あなたが本当にx変数に新しい値を割り当てることすでに宣言array変数サイズを変更することexpextでした?

いいえ、サイズがわかっている場合は配列を宣言する必要があります。

int x; 

    // ..... 

    x = atoi(input); 

    int array[x]; 

さらに、ヒープから新しい配列を割り当ててください。 xは...いつか

int arraylength; 

    // ..... 

    arraylength = atoi(input); 

    if (arraylength > 0)  // sanity check 
    { 
     int* array = malloc (arraylength * sizeof(int)); 
     if (array != NULL) // allocation succeeded 
     { 
      // use array[i]... 

      // and relese the array when no longer needed 
      free (array); 
     } 
    }