sizeof


目次に戻る


sizeof(関数じゃなくて演算子です)
先日のqsortで怪しげな使い方をして気になった人もいると思いますので、今日は sizeofの使用方法を書きます。
 
sizeofは変数がメモり空間上で何バイトの領域を占有しているかを定数で返す演算 子(予約語)です。
 
つぎのように使ってint型が何バイトあるのかを調べる方法は知っていると思います。
int i;
printf("sizeof(i) = %d\n",sizeof(i));
Win98上のBorlandC++Builder5で上の関数を実行すると「sizeof(i) = 4」と表示されます。 つまり、int型は4バイトの大きさだということです。
 
int型が何バイトだかわかったところで何に使うのかというと、私はfread、fwriteでよく 利用します。
 
fread、fwriteはデータをそのままの形でファイルストリーム(FILE*)に読み書きする関 数で、sizeofを大体次のように使います。
int data[100];
FILE *fp;

fp = fopen( "fname" , "rb" );
    :
    :
fwrite( data , sizeof( data[0] ) , sizeof( data )/sizeof( data[0] ) , fp );
    :
    :
fclose( fp );

ここで気になるのが「 sizeof( data )/sizeof( data[0] ) 」。sizeofに配列変数名を渡すと、 配列変数が使用している領域のバイト数を得られるのです。data[0]はint型のデータなの で、sizeof( data[0] )はint型の変数のバイト数が入り、sizeof(data)には配列変数全体のバイト数が 入るので、 sizeof( data )/sizeof( data[0] )で配列の要素数が得られるわけです。
 
配列変数を宣言するとき、配列の大きさを指定しないで初期化して宣言した場合も sizeofは正常に利用できます。
 
int data[]={1,2,3,4,5,6,7};
printf("sizeof(data)/sizeof(data[0]) = %d\n",sizeof(data)/sizeof(data[0]));
ちゃんと「7」という数字が入っていると思います。
次のように定数文字列の配列(?)にも利用できます。
char *data[]={"hello","bye","good"};
printf("sizeof(data)/sizeof(data[0]) = %d\n",sizeof(data)/sizeof(data[0]));
では、次のような場合はどうでしょう。
char *data = (char*)malloc( 100 );
printf("sizeof(data)/sizeof(data[0]) = %d\n",sizeof(data)/sizeof(data[0]));
free( data );
この場合、変数dataはchar型データへのポインタ変数となるので、sizeof(data)はポインタ 変数のバイト数を返してしまうのです。
 
sizeofはintやcharの他に構造体や構造体の配列に対しても使用できます。色々と試 してみてください。


目次に戻る