3

可変長配列を使用する次の関数があるとします。

void func(int size)
{
    int var1;
    int arr[size];
    int var2;
    ...
}

コンパイラは のアドレスをどのように決定しますvar2か?

私が考えることができる唯一の方法は、 と のarrvar1に配置することvar2です。

しかし、その場合、複数の可変長配列があった場合はどうなるでしょうか?

それらをすべて「通常の」変数の後に配置すると、最初のアドレスの解決に役立つだけです。

ここでの私の暗黙の仮定は、すべてのローカル変数 (VLA を含む) がスタックに割り当てられているということです。

C99標準で定義されていないことを認識しているため、問題は本質的にコンパイルに関するものです。

4

2 に答える 2

2

手順 1: 各可変サイズ項目に対して、配列へのポインターを含む隠し変数と、配列のサイズを保持する隠し変数を作成します。これらは、他の変数として最適化されたり、レジスタなどに割り当てられたりする可能性があります。

ステップ 2: 通常の方法で非可変サイズのアイテムにスペースを割り当てます。

ステップ 3: 可変サイズ項目の宣言を処理するには、サイズを評価してサイズ変数に格納します。アラインメントを考慮して、可変サイズ項目のスペースを計算します。スタック上に可変サイズの項目用のスペースを作成し、項目の場所へのポインターを隠しポインター変数に格納します。

手順 4: 非表示のポインター変数を使用して、配列要素にアクセスします。sizeof 演算子には非表示のサイズ変数を使用します。

于 2014-07-28T06:55:14.323 に答える