2013-02-21 11 views
10

私の質問は、引数が渡されたときに 動的配列 可変長配列であることがどのくらい正確に振る舞うかです。可変長配列のsizeofの振る舞い(Cのみ)

の例を考えてみましょう。この例では

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オペレータは 発現またはタイプの括弧名前であってもよい、そのオペランドのサイズ(バイト数)が得られます。サイズは、オペランドのタイプ から決定されます。結果は整数です。オペランドの型が の可変長配列型の場合、オペランドは評価されます。それ以外の場合、オペランドは評価されず、結果は整数定数です。

Iは、[オペランドが評価される....]がsizeof()ために渡された引数が ダイナミックアレイ 可変長配列である場合、sizeof()は「のように振る舞う」されていることから理解できることオペレータとしてではなくです。

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

+0

'sizeof()'はまだ演算子です。引数が可変長配列の場合は、もはやコンパイル時定数は生成されません。 –

+0

あなたのコードはコンパイルされますか?私は '可変サイズのオブジェクトが初期化されないかもしれない'エラー –

答えて

6

これは引き続き演算子として動作します。キャストも演算子であり、それも引数であると評価され、*または&もそうです。演算子は構文上のカテゴリです。それは変わらない。

重要な違いは、他のケースでは、定数として動作しながら、として振る舞うことです。


アップデート:私は評価が違いを私はなぜ表示されないことを下回るコメントが、今私はあなたが可変長配列ではsizeofを書くことができますの方法があります実現。 aの評価は確かに違いはありません

int a[x]; 
sizeof(a) 

その場合:どちらのあなたは、可変な長さの配列として宣言された変数を渡すことができます。しかし、あなたはまた、

sizeof(int[x]) 

なり、この場合、結果はx * sizeof(int)で、xが評価されなければならないだろう引数としてタイプを使用することができます。私が推測しているのは、仕様がそれを言及している理由です。

+0

"を取得し、それも引数を評価する" - いいえ、それはありません。 'sizeof()'に渡された式は評価されません。 –

+1

@ H2CO3:質問を読んでください。これは可変長配列の場合に評価されるという標準を引用しています。それは、C99の可変長配列型の唯一の表現はそのように宣言された変数であり、観察可能な効果はないので、なぜ区別が行われるのか分かりません(C++は別の問題ですが、C++ 11でもこれを含みません特徴)。 –

+1

@ H2CO3:実際、私は、可変長配列_type_を 'sizeof'に渡すと、式が評価され、おそらく観察可能な副作用があることに気付きました。答えを更新しました。 –

4

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

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

  2. これはほぼ同じように動作します。つまり、配列のサイズをバイト単位で返します。

のsizeof()関数ではなく演算子として 'のように振る舞います'。

ナー、それは決して機能しませんでした。変更された唯一のことは、VLAで使用する場合、この演算子はコンパイル時定数を生成しないことです。

+0

downvoteの理由は? –

+1

ここにはいくつかの人々がいらっしゃるので。 –