2016-09-18 10 views
0

私はユーザーからの入力として整数をとり、その可変サイズの配列を割り当てる簡単なコードを書いた。可変長配列の静的メモリ割り当てをGCCで許可するのはなぜですか?

#include <stdio.h> 

int main(){ 
    int n, i; 
    scanf("%d", &n); 

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

    return 0; 
} 

上記のコードは完全に機能します(配列のサイズがそれほど大きくない場合は、約2,150,000サイズのsegフォールトを与えます)。どのように許可されていますか?私は、配列サイズが可変であるため、これを動的メモリ割り当てを使用して行うべきだと考えました。

メモリ割り当ての概念全体が揺さぶられました。どのような条件で許可されているかを説明してください(合法的なコードでなければなりません)。

+6

Cは、18年近くにわたり、可変長配列*という概念を持っています。ストレージはまだ自動ですが、ランタイムサイズです。自動保管に関する通常の制限がすべて適用されます。 –

+0

コンパイル中も警告は表示されません。 "gcc -Wall test.c -o test"とコンパイルされました –

+0

あなたの質問は理にかなっていません。あなたのコードのどの部分が「静的」なのですか? –

答えて

0

可変長自動配列は、標準のISO C99バージョンから開始許可され、

これ2011 C規格6.7.5.2配列宣言子からの引用である:サイズが存在しない場合

配列型は不完全型です。 サイズが式ではなく*の場合、配列タイプは 可変長配列型の不定サイズで、関数プロトタイプスコープの宣言では しか使用できません。

サイズが整数定数ではない式の場合 式:関数プロトタイプスコープの宣言で発生した場合は、 は*に置き換えられたかのように扱われます。それ以外の場合は、評価するたびに と評価され、0より大きい値になります。可変長配列タイプの各 インスタンスのサイズは、 の有効期間中は変更されません。

関連する問題