表示テーマ
sizeof — 配列とポインタ
TL;DR
ISO Cの sizeof は演算子で、結果の型は size_t です。配列に使うと配列全体、ポインタに使うとポインタ型のサイズを返します。指す先の要素数は分かりません。
Example
ISO C99以降の例です。ポインタのサイズは処理系に依存するため、特定の出力値に固定しません。
c
#include <stddef.h>
#include <stdio.h>
static void show(const int *values, size_t count)
{
printf("pointer: %zu bytes, count: %zu\n", sizeof values, count);
}
int main(void)
{
int values[] = {1, 2, 3};
size_t count = sizeof values / sizeof values[0];
printf("array: %zu bytes, count: %zu\n", sizeof values, count);
show(values, count);
return 0;
}Explanation
sizeof values / sizeof values[0] が要素数になるのは、values が配列のときです。関数の仮引数に int values[3] と書いてもポインタ型に調整され、サイズ3の配列が値として渡されるわけではありません。
sizeof(char) は常に1です。Cの1バイトのビット数は <limits.h> の CHAR_BIT で確認できます。すべての環境で int が4バイト、ポインタが8バイトという保証はありません。
Pitfalls
sizeofは文字列長ではない
char text[16] = "abc"; の sizeof text は16ですが、strlen(text) は3です。ポインタを渡した先で sizeof を容量として使わず、容量を別の引数で渡します。
通常 sizeof のオペランドは評価されません。ただし可変長配列(VLA)型が関わる場合は評価が起こり得ます。副作用のある式を置く書き方は避けてください。
Related
参考
C11委員会草案 N1570 §6.5.3.4、§6.7.6.3。