19

私の質問はsizeof()、渡された引数が動的配列可変長配列である場合にどのように正確に動作するかです。

例を考えてみましょう:

int fun(int num_of_chars)
{
    char name_arr[num_of_chars] = {0};

    /* Do something*/

    return sizeof(name_arr);
}

この例では、戻り値がコンパイル時の定数ではないことは明らかです。サイズは の実行時の値に依存するためですnum_of_chars

C99 標準 (6.5.3.4) からの引用:

このsizeof演算子は、そのオペランドのサイズ (バイト単位) を返します。これは、式または括弧で囲まれた型の名前の場合があります。サイズは、オペランドの型から決定されます。結果は整数です。オペランドの型が可変長配列型の場合、オペランドが評価されます。それ以外の場合、オペランドは評価されず、結果は整数定数になります。

[....オペランドが評価されます....]から理解できることは、渡された引数がsizeof()動的配列可変長配列でsizeof()ある場合、 operator としてではなく関数のように動作することです。

私の理解は正しいですか?

4

2 に答える 2

10

それでもオペレーターとして動作します。Castは演算子でもあり、その引数を評価します。*またはも同様&です。オペレーターであることは構文カテゴリーです。それは変わりません。

重要な違いは、として動作するのに対し、他の場合は定数として動作することです。


更新:評価が違いを生む理由がわからないと以下にコメントしましたが、可変長配列でsizeofを記述できる方法が2つあることに気付きました。変数長配列として宣言された変数を渡すこともできます。

int a[x];
sizeof(a)

その場合、評価してもa実際には違いはありません。ただし、引数として型を使用することもできます。

sizeof(int[x])

この場合、結果は評価され、評価される必要がx * sizeof(int)ありxます。私が思うに、それが仕様で言及されている理由です。

于 2013-02-21T06:31:26.683 に答える
7

私の質問は、渡された引数が動的配列である場合に sizeof() がどのように正確に動作するかです。

  1. まあ、あなたはむしろ「可変長配列」(VLA)を意味していました。

  2. 動作はほぼ同じです。配列のサイズをバイト単位で返します。

sizeof() は、演算子としてではなく、関数のように動作します。

いや、それは決して関数ではありませんでした。唯一の変更点は、VLA で使用した場合、この演算子はコンパイル時の定数を生成しないことです。それ以外の場合は生成します。

于 2013-02-21T06:45:02.983 に答える