【C言語】
配列の要素数を求める時はsizeof(配列の型)ではなくてsizeof(配列名[0])と書こう

配列の要素数

warning: expression does not compute the number of elements in this array

警告:この計算式では配列の要素数は求まりません。
[-Wsizeof-array-div]


■sizeof(配列の型)で誤った要素数の求め方

//ダメ:intとshortの型が違うので要素数は求まらない
#include <stdio.h>
int main(void) {
    int     ary[10];

    size_t  len = sizeof(ary)/sizeof(short);
    for(size_t i = 0 ;i < len ;i++){
        ary[i] = i ;
        printf("ary[%zu]=%d\n",i,ary[i]);
    }  
}

配列の要素数は
sizeof(配列)/sizeof(配列[0]) で求まりますが、
上記のコードの場合
配列の型 intと分母の型short が違うので
意図した要素数は求まりません。

■sizeof(typedef型)で誤った要素数の求め方

//ダメ:U4とU2の型が違うので要素数は求まらない
//が、gcc11で検出できない
#include <stdio.h>
typedef unsigned short  U2 ;
typedef unsigned int    U4 ;
int main(void) {
    U4      ary[10] ;

    size_t  len = sizeof(ary)/sizeof(U2);
    for(size_t i = 0 ; i < len; i++){
        ary[i] = i ;
        printf("ary[%zu]=%u\n",i,ary[i]); 
    }    
}

残念ながら typedef された型の場合
gcc11ではこの警告は出ません。

■sizeof(配列名[0])が推奨する要素数の求め方

#include <stdio.h>
typedef unsigned short  U2 ;
typedef unsigned int    U4 ;
int  main(void) {
    U4      ary[10] ;

    size_t  len = sizeof(ary)/sizeof(ary[0]);
    for(size_t i = 0; i < len; i++){
        ary[i] = i ;
        printf("ary[%zu]=%u\n",i,ary[i]); 
    }    
}

sizeof(short),
sizeof(U2)等の配列の型名を使うのではなくて
sizeof(配列[0])の変数名を使うようにしましょう。

こうすると改版時配列の型を変更しても
配列の要素数を求める式は変更しなくてすみ、
思い込みによる型の間違いも避けれます。


参考:

sizeof()よりもsizeof(変数名)を使いましょう。

https://ttsuki.github.io/styleguide/cppguide.ja.html#sizeof