
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])の変数名を使うようにしましょう。
こうすると改版時配列の型を変更しても
配列の要素数を求める式は変更しなくてすみ、
思い込みによる型の間違いも避けれます。
参考:
https://ttsuki.github.io/styleguide/cppguide.ja.html#sizeof
sizeof(
型)
よりもsizeof(変数名)
を使いましょう。