任意の長さの配列を引数にとる

なぜか関数内部で配列の長さを計算出来ないので配列の長さを渡すことにしたけど
もっとうまいやり方がないものか。

追記:配列引数のサイズをsizeofで計算してると思ったら、ポインタのサイズを計算していたhttps://www.jpcert.or.jp/sc-rules/c-arr01-c.html
http://homepage3.nifty.com/mmgames/c_guide/15-06.html
追記その2:Cでは配列引数のサイズを関数内部では取得できないらしい。ポインタで渡す仕組み上仕方がないのかな。
追記その3:C++でテンプレートを使う、Vectorの参照渡しを使う、などでできるらしいけど、詳しくは読んでない。:http://dixq.net/forum/viewtopic.php?f=3&t=3618

あとint array[] = {1,2,3,4,5}で、最後に32767が代入されてるのはなんでだろう。

#include <stdio.h>
#include <stdlib.h>

#define LENGTH(x) ((sizeof(x))/(sizeof(*x)))

int multiave(int array[],int length){
  int num = length;
  int sum=0;
  int i;
  for(i=0;i<num;i++){
    sum += array[i];
  }
  return sum/num;
}

int main(void){
  int a = 1;
  int b = 2;
  int c = 3;
  int d = 4;
  int e = 5;
  int array1[] = {a,b,c};
  int array2[] = {a,b,c,d,e};
  int i;
  for(i=0;array1[i];i++) printf("'%d',",array1[i]);
  printf("\n");
  for(i=0;array2[i];i++) printf("'%d',",array2[i]);
  printf("\n");
  int ans1 = multiave(array1,LENGTH(array1));
  int ans2 = multiave(array2,LENGTH(array2));
  printf("average of %d,%d,%d is %d\n",a,b,c,ans1);
  printf("average of %d,%d,%d,%d,%d is %d\n",a,b,c,d,e,ans2);


  return 0;
}

実行結果

'1','2','3',
'1','2','3','4','5','32767',
average of 1,2,3 is 2
average of 1,2,3,4,5 is 3