2017-12-14 26 views
-2

私はこのサイトで、可変長配列は許されていませんが、gccでは可能です。だから、私は小さなコードgccで可変長配列を使用するには?

#include<stdio.h> 
#include<stdint.h> 

void main() 
{ 
    int8_t n; 
    int8_t var_array[n]; 
    int8_t i; 
    printf("Enter array size: \r\n"); 
    scanf("%d", &n); 

    for(i=0; i<n; i++) 
     var_array[i] = i; 

    for(i=0; i<n; i++) 
     printf("var_array[%d] = %d\r\n", i, var_array[i]); 
} 

をテストしたいコードは、Linux OSの「gccのvar_array.c -o var_array」コマンドでコンパイルしますが、私はそれを実行したとき、私は

Enter array size: 
5 
Segmentation fault 
セグメンテーションフォールトエラーが表示されます

私は間違って何をしていますか?

+2

*このサイトでは、可変長配列はC++で許可されていないと読んでいます。* - いいえ、この "サイト"ではありません。これらは、標準委員会によって設定されたC++の規則です。 C++配列では、変数ではなく、項目の数を表す定数式を使用する必要があります。 – PaulMcKenzie

+0

@PaulMcKenzieなぜあなたは平均的な男に出くわす必要がありますか?私の評判から、私は新人だと言うことができます。あなたは私が "このサイトで読む"という意味を知っています – KharoBangdo

+1

あなたは 'n'に値を与える前に、配列サイズを' n' **に設定しています。その時点ではおそらく**ゼロ**です(ただし何でも構いません)。 – Galik

答えて

5

%d指定子と同じように、intにしてください。 (以前は8ビットしかないため、大きな値の場合にオーバーフローする可能性があります)

あなたは未初期化変数を使用していました。そして、新しい値eof nに基づいて配列にアクセスします。インデックスはおそらく配列の境界からインデックスされ、segフォールトを与えます。

int8_tを入力する場合は、scanf("%" SCNd8, &n);を入力してください。 int8_tタイプも入力できます。

はいscanfの戻り値を確認する必要があります。

だから、理想的な呼び出しが

if(scanf("%d",&n) == 1){ 
    //...success..do work 
} 
+0

しかし、 'scanf'が失敗する可能性があり、上記のコードに[未定義の振る舞い]があります(https://en.wikipedia.org/wiki/Undefined_behavior) –

+0

コードチャンクの第4行' scanf( "%d"、&n); ' –

1

プログラムに誤りが

int8_t n;     //Here n is declared where n has random value 
int8_t var_array[n];  /*Now in this statement you have declared array 
          with the size of that random value*/ 

だから、あなたはnの入力値を取得する必要があること是正するためには、そのエラーを取得しているだろうvar_array[n]

関連する問題