定数式としてバインドされた C 配列: コード内の例外
C では、通常、バインドされた配列は定数式である必要があり、次のことが保証されます。配列のサイズはコンパイル中にわかります。ただし、場合によっては、このルールに違反しているようです。具体的な例を見てみましょう:
#include <iostream> using namespace std; int main() { int n = 10; int a[n]; // Array a with size n for (int i = 0; i < n; i++) { a[i] = i + 1; cout << a[i] << endl; } return 0; }
このコードは、Mac 上で Xcode4 を使用してコンパイルすると、エラーなしで実行されます。配列 a のサイズが定数式ではないにもかかわらず、コードは機能します。
説明: 可変長配列 (VLA)
この理由コードが機能するのは、C99 で導入された可変長配列 (VLA) と呼ばれる機能によるものです。 VLA を使用すると、コンパイル時にサイズを知る必要がある通常の配列とは異なり、配列のサイズを実行時に決定できます。
提供されたコードでは、n は定数式ではなく変数です。ただし、Xcode4 のコンパイラは VLA をサポートしているため、実行時に n の値に基づいて配列 a にメモリを割り当てることができます。
スタック割り当てとヒープ割り当て
VLA は静的配列と同様にスタック上に割り当てられることに注意することが重要です。これは、プログラムが VLA が宣言されている関数に出入りするときに、配列のメモリが自動的に割り当てられ、解放されることを意味します。この動作はヒープ上に割り当てられる通常の配列とは異なり、ポインターを使用して手動で管理する必要があります。
以上が非定数配列バインドにもかかわらず、この C コードがコンパイルされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。