目次

配列の要素数

 要素数は配列全体の大きさを1つの要素の大きさで割れば計算できる。

sizeof(配列名) / sizeof(配列名[0]);

 しかし、sizeofを利用した配列の要素数の計算は、関数の引数で渡された配列に対しては正しく計算できない。なぜならば、配列全体を引数として渡していないからである。例を示す。

 まず1つ目のプログラムである。これは普通に計算して表示させただけである。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
 
 
-
|
|
|
|
!
#include <stdio.h>
 
int main(void){
    int a[10];
 
    printf("number of elements = %d\n", (sizeof(a) / sizeof(a[0])));
    return 0;
}

 このプログラムの出力結果は次の通りである。

number of elements = 10

 次に、2つ目のプログラムである。これは配列の引数に渡された配列に対して計算したみた結果である。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 
 
 
 
-
|
|
|
|
!
 
-
|
!
#include <stdio.h>
 
void func();
 
int main(void){
    int a[10];
 
    func(a);
    return 0;
}
 
void func(int arg[]){
    printf("number of elements = %d\n", (sizeof(arg) / sizeof(arg[0])));
}

 このプログラムの出力結果は次の通りである。

number of elements = 1

 funcの引数には配列全体ではなく、配列へのポインタが渡されることになる。そのため、引数の大きさをsizeofで計算しても、ポインタの大きさにしかならない。sizeof(arg)=4バイト、sizeof(arg[0])=4バイトだから、(sizeof(arg) / sizeof(arg[0]))は1になるわけである。

配列の要素数を計算する式のマクロ化

 次のように配列の要素数を計算する式をnelementとしてマクロ化して使える。

#define nelement(array) (sizeof(array) / sizeof(array[0]))

参考文献

  • 『C言語ポインタが理解できない理由』