0

次のコードでは、配列 'x' の目的の長さをスキャンする前に可変長配列 'int array1[x]' を宣言すると、実行中に ' セグメンテーション エラー (コア ダンプ)' が発生します。(コンパイルにはエラーがありません)。コンパイル中にオプション -std=c99 を使用して、厳密に ANSI C99 標準を使用しました。

私の質問は、すべての宣言を一緒にクラブできないのはなぜですか?

// code to find a minimum value in a variable-length array
#include<stdio.h>

int minval(int [], int); 

int main(void)
{
    int x, i;

    int minivalue;

    printf("Enter the total number of array elements you wish to define?");
    scanf("%i",&x);

    int array1[x];          

    printf("Enter the elements now:");
    for (i = 0; i < x; i++)
        scanf("%i",&array1[i]);

    minivalue = minval(array1, x);

    printf("\nMinimum value in the array is = %i\n",minivalue);

    return 0;
}

int minval(int array2[], int x)     
{
    int i;
    int minivalue;

    minivalue = array2[0];

    for (i=0; i < x; i++){
        if (minivalue > array2[i])
            minivalue = array2[i];  
    }

    return (minivalue);
}
4

3 に答える 3

4

次のコードでは、配列 'x' の目的の長さをスキャンする前に可変長配列 'int array1[x]' を宣言すると、実行中に ' セグメンテーション エラー (コア ダンプ)' が発生します。

初期化されていない値で可変長配列を宣言することはできません。

int array1[x]を前に移動すると、 に有効な値がscanf()ありxません。

于 2012-04-24T10:50:41.910 に答える
0

交換

int array1[x]; 

int* array1 = (int*) malloc (x * sizeof int);

したがって、 x 要素が に含まれるのに十分なメモリを割り当てますarray1

追加して、メモリを解放することを忘れないでください

free(array1)

プログラムの最後に。

于 2012-04-24T08:47:19.160 に答える
0

@Saurabh: C99 標準で実行時に「コンピューター」を再生してみてください。宣言 int x に出くわします。いくつかの大きなガベージ値があります。次に、大きな値で配列宣言を読み取ります-それを割り当てようとします-スタックメモリが不足します-セグフォールト。代わりに、適切なサイズの x の値を最初に読み取り、次に配列割り当てを読み取ると、スタックにメモリを割り当てることができます。とにかく、この c99 の機能は良くありません。代わりに std::vector を使用してください。

于 2012-06-15T01:01:37.243 に答える