Skip to content

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)型が関わる場合は評価が起こり得ます。副作用のある式を置く書き方は避けてください。

参考

C11委員会草案 N1570 §6.5.3.4、§6.7.6.3。