スポンサーリンク

関数の引数にセットした配列を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 

スポンサーリンク