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

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

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


■1.sizeof(配列の型)で誤った例(基本型)

//ダメ:intとshortの型が違うので要素数は求まらない
void f1(void) {
    int     配列[10];
    int     要素数 = sizeof(配列)/sizeof(short);//★NG
    for(int i = 0 ;i < 要素数 ;i++){
        配列[i] = 0 ; 
    }  
}

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

■2.sizeof(配列の型)で誤った例(typedef型)

typedef unsigned short  U2 ;
typedef unsigned int    U4 ;
//ダメ:U4とU2の型が違うので要素数は求まらない
//が、gcc11で検出できない
void f2(void) {
    U4      配列[10] ;
    int     要素数 = sizeof(配列)/sizeof(U2);//★NG
    for(int i = 0 ;i < 要素数;i++){
        配列[i] = 0 ; 
    }    
}

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

■3.sizeof(配列名[0])(推奨)

typedef unsigned short  U2 ;
typedef unsigned int    U4 ;
void f3(void) {
    //修正例
    U4      配列[10] ;
    int     要素数 = sizeof(配列)/sizeof(配列[0]);//OK
    for(int i = 0;i < 要素数;i++){
        配列[i] = 0 ; 
    }    
}

sizeof(short),siezeof(U2)等の型名を使うのではなくて
sizeof(配列[0])の変数名を使うようにしましょう。
こうすると改版時配列の型を変更しても
配列の要素数を求める式は変更しなくてすみ、
思い込みによる型の間違いも避けれます。


参考:

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

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