sizeof 演算子
オブジェクトまたは型のサイズを問い合わせます。
オブジェクトの実際のサイズを知る必要があるときに使用されます。
構文
sizeof( type )
|
(1) | ||||||||
sizeof expression
|
(2) | ||||||||
どちらのバージョンも size_t 型の値を返します。
説明
ノート
コンピュータアーキテクチャによって、バイトは8ビットであったり、それより大きかったりします。 正確な値は CHAR_BIT として提供されます。
sizeof(char)、 sizeof(signed char)、および sizeof(unsigned char) は必ず 1 を返します。
sizeof は関数型、不完全型 (void を含みます)、およびビットフィールドの左辺値に使用することはできません。
構造体型または共用体型の被演算子に適用したとき、その結果はそのオブジェクトの合計バイト数です (内部および末尾のパディングを含みます)。 末尾のパディングは、もしそのオブジェクトが配列の要素として使用された場合にその配列の次の要素のアライメント要件を満たすようなサイズになります。 別の言い方をすると、 sizeof(T) は配列 T[] の要素1つあたりのサイズを返します。
|
type が VLA 型であり、そのサイズ式の値が sizeof の結果に影響しないであろう場合、サイズ式が評価されるかどうかは未規定です。 |
(C99以上) |
expression の型が VLA の場合を除き、 (C99以上) expression は評価されず、 sizeof 演算子は整数定数式内で使用できます。
|
expression の型が VLA 型の場合、 expression は評価され、その評価対象の配列のサイズは実行時に計算されます。 |
(C99以上) |
配列 a (VLA を含みます) (C99以上) の要素数は式 sizeof a / sizeof a[0] を用いて取得できます。 a がポインタ型の場合 (関数の引数型調節の配列からポインタへの変換の後など) は、この式は単純にポインタ型のバイト数を指す先の型のバイト数で割ったものになります。
キーワード
例
出力例はポインタが64ビットで int が32ビットのプラットフォームのものです。
#include <stdio.h>
int main(void)
{
short x;
// 型引数
printf("sizeof(float) = %zu\n", sizeof(float));
printf("sizeof(void(*)(void)) = %zu\n", sizeof(void(*)(void)));
printf("sizeof(char[10]) = %zu\n", sizeof(char[10]));
// printf("sizeof(void(void)) = %zu\n", sizeof(void(void))); // エラー (関数型)
// printf("sizeof(char[]) = %zu\n", sizeof(char[])); // エラー (不完全型)
// 式引数
printf("sizeof 'a' = %zu\n", sizeof 'a'); // 'a' の型は int です。
// printf("sizeof main = %zu\n", sizeof main); // エラー (関数型)
printf("sizeof &main = %zu\n", sizeof &main);
printf("sizeof \"hello\" = %zu\n", sizeof "hello"); // "hello" の型は char[6] です。
printf("sizeof x = %zu\n", sizeof x); // x の型は short です。
printf("sizeof (x+1) = %zu\n", sizeof(x+1)); // x+1 の型は int です。
}
出力例:
sizeof(float) = 4
sizeof(void(*)(void)) = 8
sizeof(char[10]) = 10
sizeof 'a' = 4
sizeof &main = 8
sizeof "hello" = 6
sizeof x = 2
sizeof (x+1) = 4
参考文献
- C11 standard (ISO/IEC 9899:2011):
- 6.5.3.4 The sizeof and _Alignof operators (p: 90-91)
- C99 standard (ISO/IEC 9899:1999):
- 6.5.3.4 The sizeof operator (p: 80-81)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.3.3.4 The sizeof operator
関連項目
sizeof 演算子 の C++リファレンス
|