ストックがなくなったので、久しぶりに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バイト・・・。
このように配列とポインタで解釈が違うので注意・・・。