私はC言語では配列のサイズが動的ではないと知っています。sizeof()を使用して配列の長さを定義できますか?
これを念頭に置いて、次のコードは許可されますか? (ダブルと同じ長さの文字の配列を宣言しようとしています。)
char bytes[sizeof(double)];
私の推測では、sizeof
は、プログラムの実行中にその引数で動作し、ので、これは許されないだろうということですが、私はよく分かりません。
また、これがCではなくC++であれば違いはありますか?
私はC言語では配列のサイズが動的ではないと知っています。sizeof()を使用して配列の長さを定義できますか?
これを念頭に置いて、次のコードは許可されますか? (ダブルと同じ長さの文字の配列を宣言しようとしています。)
char bytes[sizeof(double)];
私の推測では、sizeof
は、プログラムの実行中にその引数で動作し、ので、これは許されないだろうということですが、私はよく分かりません。
また、これがCではなくC++であれば違いはありますか?
sizeof式は(コンパイラによってプリプロセッサではなく)コンパイル時に評価されるため、式は合法です。
ダイナミックアレイが許可されているC99では、このルールの例外があります。その場合、sizeofはコンテキストに応じて、実行時に評価されます(http://en.wikipedia.org/wiki/Sizeof)。それは質問の表現の合法性を変えない。
はい、これは問題ありません。 sizeof()の値はコンパイル時に決定されます。
sizeof(double)
はコンパイル時の定数なので、可能ですし、動的サイズでもありません。
オペランドが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;
}
で "ランニング" を参照してください。