7.9 型のサイズ
7.9.1 値のサイズを得る
どのような変数にも、構造体や共用体のインスタンスにも、値を保存するためのメモリ領域が割り当てられています。例えば int 型は 32 ビットコンピュータにおいて 4 バイトのメモリ領域を割り当てます。つまり int 型の変数を用いた場合、メモリを 4 バイト消費するということです。今ではメモリの大容量化によって、開発者が神経質に容量を気にする必要はなくなってきましたが、メモリはプログラミングにおいて重要な要素です。
C 言語では変数や型からサイズを取得する sizeof 演算子を使って型サイズを調べることができます。sizeof 演算子は指定した値のバイト数を返します。sizeof が返す整数値を使うことで、ポインタの演算や構造体の操作に応用できます。
sizeof 式
これによって、式で指定した変数や型のメモリサイズを取得することができます。sizeof 演算子で指定する式は、通常は何らかの識別子(変数名)となります。
#include <stdio.h> int main() { char c; short si; int i; printf("char = %d : short = %d : int = %d\n" , sizeof c , sizeof si , sizeof i ); return 0; }
コード1では、char 型の変数 c、short 型の変数 si、そして int 型の変数 i のサイズを sizeof 演算子で調べ、これを表示します。結果はシステムによって異なりますが、char のサイズは必ず 1 となるでしょう。もし 32 ビットコンピュータであれば int 型のサイズは 4 バイト、short は 2 バイトであることが想定されます。sizeof 演算子を用いることで、使っているシステムにおいて C 言語の単純型が何バイトのメモリを割り当てているのかを正確に調べることができます。
しかし、型のサイズを調べたいだけなのに、わざわざ使用しない変数を作成するのは無駄です。sizeof 演算子は式を与える以外に、括弧で囲んだ型を指定することも可能です。これによって、値ではなく型名からサイズを調べることができます。
sizeof (型指定子)
型指定子は単純型だけではなく、構造体型や typedef 名を指定することも可能です。
#include <stdio.h> typedef struct { int x , y; } Point; typedef union { char c; short si; int i; } Value; int main() { printf("Point = %d : Value = %d\n" , sizeof(Point) , sizeof(Value)); return 0; }
コード2は、sizeof 演算子に型を指定しています。これによって、Point 構造体や Value 共用体のバイトサイズを取得することができます。Point 構造体は sizeof (int) * 2 に等しく、Value 共用体は最もサイズの大きいメンバ int に等しいサイズであることを確認することができるでしょう。