sizeof演算子

ストックがなくなったので、久しぶりにC言語のSampleの続きを・・・。

sizeof演算子は、型、変数、ポインタ、配列、構造体、式などのサイズを返す演算子・・・。

sizeof <型、変数、ポインタ、配列、構造体、式など>

よく括弧でくくるので、

sizeof(<型、変数、ポインタ、配列、構造体、式など>)

こんな感じで関数みたいに見えることが多いが演算子・・・。

まず、型のサイズを見てみる・・・。

こんな感じで型にsizeofを適用・・・。

次はこれらの型の変数・・・。

で宣言し、

で変数にsizeof・・・。

続いて、int型配列とint型ポインタでsizeofを適用するとどうなるかを試す・・・。

として、

arrayの先頭アドレスをptrが持っているので、値は同じのはずだがどうなるか・・・。

sizeof(array)とsizeof(ptr)・・・。

最後は、

文字列マクロのSTRと、

文字配列strと、文字列リテラルのアドレスを持つポインタpstr・・・。

これもどうなるか・・・。

$ vi sizeof.c
$ gcc -m32 -o sizeof sizeof.c
$

32bitでコンパイルするか64bitでコンパイルするかでちょっと結果が違うので、今回は32bitでコンパイル・・・。
実行すると、

$ vi sizeof.c
$ gcc -m32 -o sizeof sizeof.c
$ ./sizeof
sizeof(char) = 1
sizeof(int) = 4
sizeof(float) = 4
sizeof(double) = 8
sizeof(c) = 1
sizeof(i) = 4
sizeof(f) = 4
sizeof(d) = 8
sizeof(array) = 20
sizeof(ptr) = 4
sizeof(str) = 6
sizeof(pstr) = 4
sizeof(STR) = 6
$

こうなる・・・。
charは1バイト、intとfloatは4バイト、doubleは8バイト・・・。
変数の時もこれは変わらない・・・。

配列arrayは(intのサイズ4バイト * 要素数5)で20バイトとなっている・・・。
それに対し、ポインタptrはあくまでポインタのサイズだけを返しているので4バイト・・・。(ポインタのサイズは32ビットでは常に4バイト)

文字配列strはその文字配列に必要なバイト数を返している・・・。
(5文字 + NULL文字も含む)で必要なのは6バイト・・・。
pstrはポインタなのでやはり4バイト・・・。
#defineで定義したSTRの場合は、その文字列に必要なサイズを返すようになっているため6バイト・・・。

このように配列とポインタで解釈が違うので注意・・・。

ちなみに64bitでコンパイルすると、ポインタのサイズは8バイトになるのでこれも注意・・・。

Sample/sizeof.c at master · bg1bgst333/Sample · GitHub