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