2011-11-23 3 views
5

私はC言語では配列のサイズが動的ではないと知っています。sizeof()を使用して配列の長さを定義できますか?

これを念頭に置いて、次のコードは許可されますか? (ダブルと同じ長さの文字の配列を宣言しようとしています。)

char bytes[sizeof(double)]; 

私の推測では、sizeofは、プログラムの実行中にその引数で動作し、ので、これは許されないだろうということですが、私はよく分かりません。

また、これがCではなくC++であれば違いはありますか?

答えて

7

sizeof式は(コンパイラによってプリプロセッサではなく)コンパイル時に評価されるため、式は合法です。

ダイナミックアレイが許可されているC99では、このルールの例外があります。その場合、sizeofはコンテキストに応じて、実行時に評価されます(http://en.wikipedia.org/wiki/Sizeof)。それは質問の表現の合法性を変えない。

1

はい、これは問題ありません。 sizeof()の値はコンパイル時に決定されます。

6

sizeof(double)はコンパイル時の定数なので、可能ですし、動的サイズでもありません。

1

オペランドがVLAでない場合は、sizeofを実際のコンカレントとして使用できます。

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    double x; 
    unsigned char dbl[sizeof x];        /* real constant */ 

    /* make x's format have a 1 bit on the "correct" place */ 
    x = 32.000000000000004; 
    memcpy(dbl, &x, sizeof x); 
    switch (dbl[0]) { 
    case sizeof *dbl: puts("1"); break;     /* real constant */ 
    case 0: puts("0"); break; 
    default: puts("other"); 
    } 
    return 0; 
} 

コードがhttp://ideone.com/95bwM

で "ランニング" を参照してください。
関連する問題