スポンサーリンク
関数の引数にセットした配列を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
スポンサーリンク