2008年12月9日火曜日

C言語では、関数の引数として、配列のサイズを指定しないこと

引数として、配列のサイズを指定しても意味がないことはC言語としての常識ですが、残念ながら、Cのプログラマーはすべて知っているわけではない。
例えば、下記ソースをコンパイルして、実行すると、mainArrayのサイズは40でsubArrayのサイズは4になる。
なぜかというと、4は配列のサイズではなく、ただのポインタのサイズなのである。

つまり、下記のコメントアウトした行はその下の行とはまったく同じ意味になる。

C言語はJavaなどと違って、引数でサイズを宣言しても、下記のようにSub関数で明らかにサイズを越えている場合でも、コンパイルエラーにならないので、注意が必要だ。

#include "stdio.h"

static void accessArray(int subArray[100]);
int main(void)
{
int mainArray[10];
printf("sizeof mainArray = [%d]\n", sizeof(mainArray));
accessArray(mainArray);
return 0;
}

//static void accessArray(int * subarray)
static void accessArray(int subArray[100])
{
subArray[1]= 1;
printf("sizeof subArray = [%d]", sizeof(subArray));
return;
}

0 件のコメント: