C での VLA を理解する : 非定数式の配列境界
C では、配列境界が常に次でなければならないというのはよくある誤解です。定数式。ただし、特定のシナリオでは、コンパイラは、可変長配列 (VLA) として知られる機能を通じて可変配列境界を許可する場合があります。次のコード スニペットが正常にコンパイルされる理由を調べてみましょう:
#include <iostream> using namespace std; int main() { int n = 10; int a[n]; for (int i = 0; i < n; i++) { a[i] = i + 1; cout << a[i] << endl; } return 0; }
VLA とスタック割り当て
このコード スニペットが機能するのは、Xcode4 のコンパイラなど、一部のコンパイラが機能するためです。 Mac、VLA をサポートします。 VLA を使用すると、実行時の値に基づいて可変数の要素を含む配列を割り当てることができます。この場合、配列 'a' のサイズは 'n' の値によって決まります。
VLA 割り当ては、ヒープではなくスタック上で行われるという点で、従来の静的メモリ割り当てとは異なります。これは、配列の有効期間が宣言されているスコープに制限されることを意味します。
なぜ許可されているのですか?
C99 では VLA が機能として導入されましたが、その存在はC ではコンパイラに依存します。一部の C コンパイラは、これを拡張機能として実装します。さらに、特定のシナリオでは、コンパイラが動的にメモリを割り当て、VLA のような動作を提供することにより、VLA のような動作を許可する場合があります。
使用法と制限事項
VLA は柔軟性を提供します。動的に配列のサイズを変更します。ただし、次のような制限があることに注意することが重要です。
結論
コード スニペットは VLA サポートにより正常にコンパイルされる可能性がありますが、一般に C コードで VLA を使用することは推奨されません。これにより、実装固有の動作と潜在的な移植性の問題が発生します。定数境界を使用して配列を宣言する従来の方法に固執することをお勧めします。
以上がC で可変長配列 (VLA) を非定数配列境界に使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。