2016-12-22 18 views
-1

私は次のコードが実行されるべきではないことを知っています。cでのサイズ配列の宣言

最初の問題は、ループの内側で 'int i'を宣言し、開始コードではないことです。

次の問題は、配列サイズが実行時に定義されているため、動的割り当てを使用する必要があることです。

私は "セグメント"を得ると予想されました。

私はコマンドでそれを実行します。

gcc -Wall commandLineArgument.c -o ex1

int main(void){ 
    int size=0; 
    printf("enter number:\n"); 
    scanf("%d",&size); 
    printf("The size is: %d\n",size); 
    int arr[size]; 
    for(int i= 0;i<size;i++) 
    { 
    arr[i] = 5; 
    } 

    for(int i= 0;i<size;i++) 
    { 
    printf("%d,",arr[i]); 
    } 
    printf("\n"); 
    return 0;} 

編集 可変長配列は、更新コードが実行されているか、その後C99 以来、Cでサポートされている場合は?

gcc -Wall -std=c89 commandLineArgument.c -o ex1 

int main(void){ 
int i; 
int size=0; 
printf("enter number:\n"); 
scanf("%d",&size); 
printf("The size is: %d\n",size); 
int arr[size]; 
printf("The size of arr: %lu\n",sizeof(arr)); 
for(i= 0;i<size;i++) 
{ 
    arr[i] = 5; 
} 

for(i= 0;i<size;i++) 
{ 
    printf("%d,",arr[i]); 
}  
printf("\n"); 
return 0;} 
+2

[ユーザー定義配列の長さから格納された配列値]の重複の可能性があります(http://stackoverflow.com/questions/18951151/store-array-values-from-user-defined-array-lengths) –

+2

とは何ですか?あなたの質問? – artm

+0

最初の部分については、Cでは許可されますがC++では許可されません。 2番目の部分では、それぞれ定義された 'i'は対応するループのスコープを持ちます。 –

答えて

1

これは時代遅れです。あなたのコードは、C99以降C言語で有効です。

少なくともC99以降、ループforにローカルでiを宣言できます。

可変長配列は、C99以降Cでサポートされています。 (これはC++でもサポートされていないことに注意してください17)。

+0

*自動保存期間*があります。それはすべての標準が言っている。私はそれをスタック上にあると考えることができると思います。 – Bathsheba

+0

OK、配列はスタック内にありますか? – dids

+1

C標準には* stack *という概念はありません。それで、私は本当にそれについて話をしないように注意しています。私はそれが 'size'と同じ長さの固定サイズの配列と同じ場所に格納されなければならないと確信していません。多分それをCと言語弁護士にタグ付けして質問してください。 – Bathsheba

1

gccの古いバージョンを使用しているようです。

使用しようとしている2つの機能がC99に追加されました。 gccバージョン5より古いバージョンのデフォルトは、古いC89標準を使用してコンパイルすることです。後の標準で追加された機能を使用するには、より新しい標準を使用するように、旧バージョンのgccを明示する必要があります。

コンパイラオプション-std=c11は、現在のC11標準を使用するようにgccに指示します。必要最小限は-std=99です。

私はあなたが現在の標準を使用するようにgccを伝えることをお勧めします:

gcc -Wall -std=c11 commandLineArgument.c -o ex1 

あなたの問題を解決するための別の方法はgcc V5以降にアップグレードすることです。

関連する問題