warning: division ‘sizeof (int *) / sizeof (int)’ does not compute the number of array elements
警告:’sizeof (int *) / sizeof (int)’ は、配列の要素数を計算しません。
[-Wsizeof-pointer-div]
■1.sizeof(配列を指すポインタ)の間違い
void f1(int *ary) {
//期待する配列の要素数にならない
int num = sizeof(ary)/sizeof(ary[0]);//★NG
printf("%d\n",num);
}
int main(void) {
int ary[128];
f1(ary);
}
sizeof(配列)/sizeof(配列[0])で
要素数を求める技はポインタには使えません 。
配列に対して使ってください。
※呼び元のmain( )では ary は配列でしたが
呼び先のf1( )では aryはポインタです。

■2.sizeof(配列形式の引数)の間違い
warning: ‘sizeof’ on array function parameter ‘buf’ will return size of ‘char *’
警告:sizeof(配列形式の関数引数)では配列サイズは得られない
[-Wsizeof-array-argument]
#include <stdio.h>
void f2(int ary[128]) {
//NG:期待する配列のサイズにならない
printf("%ld\n",sizeof(ary));
//NG:期待する配列の要素数にならない
int num = sizeof(ary)/sizeof(ary[0]);
printf("%d\n",num);
}
int main(void) {
int ary[128];
f2(ary);
}
void f2(int ary[128])
↓
128という数字をコンパイラは無視
↓
void f2(int ary[])と同じ
↓
関数仮引数は配列形式もポインタ形式も同じ
↓
void f2(int *buf)と同じ
このため
sizeof(ary)は
配列のサイズ128ではなくて
ポインタのサイズが求まります。
※プログラマが期待しているのは恐らく配列のサイズでしょう。
配列のサイズが欲しい場合は別途引数を用意して親関数からサイズを教えてもらう必要があります。
参考:
https://www.jpcert.or.jp/sc-rules/c-arr01-c.html
