4

Sizeof 演算子はコンパイル時の演算子です。コンパイル時に sizeof 式を定数の結果値に変換します。[例外可変個引数テンプレート c99]

通常、コンパイラはコンパイル時に変数のサイズを修正します。配列 n の場合。しかし、sizeof配列を印刷すると、正しいサイズになりますか? このコードはコンパイル時に n のメモリを割り当てますか?

sizeof はどのように評価されますか?

関数内の配列 a[] はどうですか?

int fun(int n)
{
    char a[n+3];
    return sizeof(a);
}
int
main( )
{
    int i;
    while(i!=-1){
        scanf("%d",&i);
        int n[i];
        printf("\nsize: %d %d\n",fun(3),sizeof n);
    }
}

これを試してみると、 sizeof は n のサイズを正しく [(sizeof (int)) * i] に出力しますが、関数は常に間違った結果を返します 6?

sizeof はどのように実装され、サイズを計算しますか (float、int、...データ型、変数、配列など) ?

どんなコードでも大歓迎です!

4

3 に答える 3

0

のオペランドがsizeof可変長配列 (VLA) でsizeofない場合、実際には何も「計算」しません。結果は、コンパイル時の定数としてコンパイラにすぐに認識されます。sizeofその定数は、コンパイル中に代わりに置き換えられます。

オペランドが VLA の場合、コンパイラは、VLA 自体からサイズ情報を取得するコードを生成するだけです。したがって、はい、一般的に、典型的な実装では、VLA 自体の内部に VLA のサイズを格納します。あなたの例では、割り当てられたメモリには値aを格納する場所も含まれることを意味しn + 3ます。

もちろん、コンパイラは、明らかな場合にこの評価を最適化し、最も明白な場合にはコンパイル時の定数に置き換えることさえできます。あなたの例では、コンパイラは配列からサイズを取得しないほどスマートかもしれませんがa、代わりにサイズが に等しいことをすぐに認識しn + 3ます。

于 2013-06-04T05:25:36.183 に答える