Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
sizeof
『sizeof』演算子は、データ型や変数がメモリ上で占めるバイト数を返します。環境依存のサイズをコード内に直接書くことなく、移植性の高いプログラムを書くために活用されます。
構文
// 型のサイズをバイト数で返します。 sizeof(型) // 変数のサイズをバイト数で返します。 sizeof(変数名) sizeof 変数名 // 変数の場合は括弧を省略できます。 // 配列全体のバイト数を返します。 sizeof(配列名) // 配列の要素数を求めるイディオムです。 sizeof(配列名) / sizeof(配列名[0])
主な型のサイズ(64ビット環境の目安)
| 型 | サイズ | 概要 |
|---|---|---|
| char | 1バイト | C言語では『sizeof(char)』は常に1と定義されています。 |
| short | 2バイト | ほぼすべての環境で2バイトです。 |
| int | 4バイト | 多くの環境で4バイトですが、規格では『short以上』と定められています。 |
| long | 4〜8バイト | Windowsの64ビットでは4バイト、Linux/macOSの64ビットでは8バイトです。 |
| long long | 8バイト | C99で追加された型です。64ビット整数を保証します。 |
| float | 4バイト | IEEE 754単精度浮動小数点数です。 |
| double | 8バイト | IEEE 754倍精度浮動小数点数です。 |
| pointer | 4〜8バイト | 32ビット環境では4バイト、64ビット環境では8バイトです。 |
サンプルコード
#include <stdio.h>
int main(void) {
// 各型のサイズを確認します。
printf("char: %zu バイト\n", sizeof(char));
printf("short: %zu バイト\n", sizeof(short));
printf("int: %zu バイト\n", sizeof(int));
printf("long: %zu バイト\n", sizeof(long));
printf("long long: %zu バイト\n", sizeof(long long));
printf("float: %zu バイト\n", sizeof(float));
printf("double: %zu バイト\n", sizeof(double));
// 変数のサイズを調べます。
int n = 42;
double x = 3.14;
printf("変数 n のサイズ: %zu バイト\n", sizeof n);
printf("変数 x のサイズ: %zu バイト\n", sizeof x);
// 配列全体のサイズと要素数を求めます。
int scores[10];
printf("配列のサイズ: %zu バイト\n", sizeof(scores)); // 40バイト(10 × 4)
printf("配列の要素数: %zu\n", sizeof(scores) / sizeof(scores[0])); // 10
// ポインタのサイズはアドレス幅に依存します。
int *p = &n;
printf("ポインタのサイズ: %zu バイト\n", sizeof(p)); // 64ビット環境では8
// sizeof を使った動的メモリ確保(malloc と組み合わせます)。
// int *arr = malloc(sizeof(int) * 100);
return 0;
}
概要
『sizeof』はコンパイル時に評価される演算子です(可変長配列に使う場合を除く)。返り値の型は『size_t』という符号なし整数型で、『printf』では『%zu』で出力します。
配列をポインタに代入したり関数に渡したりすると、『sizeof』はポインタ自体のサイズを返します。配列全体のサイズは、配列を直接渡したときのみ正しく取得できます。これは「配列のポインタへの減衰」と呼ばれる挙動です。
動的メモリ確保(『malloc()』)と組み合わせる際は、型のサイズをハードコードせず『sizeof(型)』を使うことで移植性が高まります。構造体のサイズも『sizeof』で取得できますが、アライメント(境界整列)のためパディングが挿入されることがあります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。