サイズを得る
データサイズを調べる
C言語では、変数を使用するのに変数の型を指定します
しかし、ANSI C標準では正確なサイズは定義されていません
つまり、int型の変数を宣言すると16ビットの領域を確保する環境もあれば
32ビットの領域を確保する環境も存在します(Windows9xのような32ビットコンピュータでは、32ビットですね)
これでは、コンパイルする環境が変わればソースも書き直さなくてはなりません
ですが、最低限の範囲で書きかえることなく互換性をとりたいと思うのも人情です
そこで、データサイズをプログラムの中で調べることができるsizeof演算子があります
sizeof(型);
sizeof 変数名;
指定された型や変数のデータサイズを返します
サイズはバイト単位で返されます
この演算子は、ファイル操作などでは活用されるでしょう
#include <stdio.h>
int main() {
int i;
printf("int = %d : i = %d\ndouble = %d" ,
sizeof(int) , sizeof i , sizeof(double));
return 0;
}
出力される数値は、環境によって異なります
WindowsプラットフォームのBorland C++ Compiler 5.5では次のようになりました
int = 4 : i = 4
double = 8
Windows9xかNT系を使っているユーザであれば、これと同じ結果だったと思います
int型は4バイト、double型は8バイトの領域を確保していることがわかります
また、sizeof演算子は次のように計算式を使用することもできます
#include <stdio.h>
int main() {
char ch;
int i;
printf("%d" , sizeof i + ch);
return 0;
}
このプログラムが出力する値は、int型とchar型のバイト数を加算した値です
sizeof演算子は構造体変数のサイズを得ることもできます
やはり一般的には、構造体のサイズを得るのに各メンバを手作業で数えるような事はしません
移植性の低下や、一部のコンパイラの実装依存でサイズが変更することがあるためです
構造体変数のサイズをえるには、次のように指定します
sizeof(struct タグ名);
structキーワードは、タグ名を指定する場合は必ず指定します
定義された構造体変数の場合は必要ありません
#include <stdio.h>
struct TEST {
unsigned int bit:8 ;
}obj;
int main() {
printf("obj = %d\n" , sizeof(obj));
printf("struct TEST = %d" , sizeof(struct TEST));
return 0;
}
このプログラムでは、おそらくint型のサイズが得られると思います
ビットフィールドがそのビット数ではなく、ある領域の一部として存在することを証明しています
メンバ変数bitはある領域の中の8ビットのフィールドであるということですね(詳しくはビットフィールドを参照)
このように、何らかの目的で構造体フィールドのサイズを指定する場合
sizeof演算子を使用して指定するようにしましょう
size_t型
sizeof演算子は指定したデータ型や変数のサイズを返します
しかし、その値はint型ではないのです
では、どのような型なのかというと標準型と呼ばれると特殊な型でsize_tという型です
この型はライブラリで定義されている標準型のうちのひとつです
#include <stdio.h>
void outSize(size_t size);
int main() {
size_t i = 100;
outSize(i);
outSize(100000);
return 0;
}
void outSize(size_t size) {
printf("%d\n" , size);
}
sizeof expression
データ型、または変数の実サイズを返します
静的次元配列に sizeof を使うと、配列全体のサイズを返します
sizeof 演算子は動的に割り当てられた配列または外部配列のサイズは返せません
expression - 型名、または変数名を指定します