C で配列のサイズを確認するにはどうすればよいですか?

要旨:

int a[17];
size_t n = sizeof(a)/sizeof(a[0]);

完全な答え:

配列のサイズをバイト単位で決定するには、 sizeof を使用できます オペレーター:

int a[17];
size_t n = sizeof(a);

私のコンピューターでは、int は 4 バイトの長さなので、n は 68 です。

配列内の要素の数を決定するには、配列の合計サイズを配列要素のサイズで割ります。次のように、型でこれを行うことができます:

int a[17];
size_t n = sizeof(a) / sizeof(int);

適切な答え (68 / 4 =17) を取得しますが、a のタイプの場合 sizeof(int) を変更するのを忘れると厄介なバグが発生するように変更されました

したがって、好ましい除数は sizeof(a[0]) です または同等の sizeof(*a) 、配列の最初の要素のサイズ。

int a[17];
size_t n = sizeof(a) / sizeof(a[0]);

もう 1 つの利点は、マクロで配列名を簡単にパラメータ化して取得できることです。

#define NELEMS(x)  (sizeof(x) / sizeof((x)[0]))

int a[17];
size_t n = NELEMS(a);

sizeof 正しい道は違う パラメータとして受け取っていない配列を扱っています。関数にパラメーターとして渡される配列はポインターとして扱われるため、sizeof 配列のサイズではなく、ポインターのサイズを返します。

したがって、関数内ではこのメソッドは機能しません。代わりに、常に追加のパラメーター size_t size を渡します 配列内の要素数を示します。

テスト:

#include <stdio.h>
#include <stdlib.h>

void printSizeOf(int intArray[]);
void printLength(int intArray[]);

int main(int argc, char* argv[])
{
    int array[] = { 0, 1, 2, 3, 4, 5, 6 };

    printf("sizeof of array: %d\n", (int) sizeof(array));
    printSizeOf(array);

    printf("Length of array: %d\n", (int)( sizeof(array) / sizeof(array[0]) ));
    printLength(array);
}

void printSizeOf(int intArray[])
{
    printf("sizeof of parameter: %d\n", (int) sizeof(intArray));
}

void printLength(int intArray[])
{
    printf("Length of parameter: %d\n", (int)( sizeof(intArray) / sizeof(intArray[0]) ));
}

出力 (64 ビット Linux OS の場合):

sizeof of array: 28
sizeof of parameter: 8
Length of array: 7
Length of parameter: 2

出力 (32 ビット Windows OS):

sizeof of array: 28
sizeof of parameter: 4
Length of array: 7
Length of parameter: 1

sizeof は注目に値します。 ポインターに減衰した配列値を処理する場合は役に立ちません。配列の先頭を指していても、コンパイラーにとっては、その配列の単一要素へのポインターと同じです。ポインターは、それを初期化するために使用された配列について、それ以外のことを「記憶」しません。

int a[10];
int* p = a;

assert(sizeof(a) / sizeof(a[0]) == 10);
assert(sizeof(p) == sizeof(int*));
assert(sizeof(*p) == sizeof(int));