関数の引数にセットした配列をsizeofすると、ポインタの型のサイズが返される
関数の引数にセットした配列をsizeofすると、ポインタで指定するわけなので、
ポインタの型のサイズが返されてしまいます。
例えば、下記の配列を定義して、
int array[] = {4, 2, 8, 7, 1, 2, 3};
下記の関数があったとします。
void getSize(int* array){
printf("The size of array = %lu\n", sizeof(array) / sizeof(array[0]));
printf("The size of array = %lu\n", sizeof(array));
printf("The size of array[0] = %lu\n", sizeof(array[0]));
printf("The size of int* = %lu\n", sizeof(int*));
}
sizeof(array) / sizeof(array[0]) は、結果が2となってしまいます。
これは、sizeof(array) がポインタなので、sizeof(int*)と同義となるからですね。
なので、下記のように配列のサイズとセットで、
関数に渡してあげると良いかと思います。
マクロでサイズを指定しても良いですね。
void getItem(int* array, int size){
int i;
printf("The size of array = %d\n", size);
for(i = 0; i < size; i++){
printf("%d ", array[i]);
}
printf("\n");
}
サンプルコード
下記がサンプルコードになります。
$ cat sample.c
#include <stdio.h>
void getSize(int* array){
printf("The size of array = %lu\n", sizeof(array) / sizeof(array[0]));
printf("The size of array = %lu\n", sizeof(array));
printf("The size of array[0] = %lu\n", sizeof(array[0]));
printf("The size of int* = %lu\n", sizeof(int*));
}
void getItem(int* array, int size){
int i;
printf("The size of array = %d\n", size);
for(i = 0; i < size; i++){
printf("%d ", array[i]);
}
printf("\n");
}
int main(){
int array[] = {4, 2, 8, 7, 1, 2, 3};
getSize(array);
int size = (int)(sizeof(array) / sizeof(array[0]));
getItem(array, size);
return 0;
}
下記が実行結果になります。
$ gcc -o sample sample.c $ ./sample The size of array = 2 The size of array = 8 The size of array[0] = 4 The size of int* = 8 The size of array = 7 4 2 8 7 1 2 3
