extern宣言した配列のサイズをsizeofで取得するには
正しく配列のサイズを取得できるケース
test.c
int array[] = {1,2,3};
Main.c
#include <stdio.h> extern int array[3]; int array2[] = {1,2,3}; int main(void){ printf("array size is %d\n",(int)sizeof(array)); printf("array2 size is %d\n",(int)sizeof(array2)); return 0; }
出力
array size is 12 array2 size is 12
正しく配列のサイズを取得できないケース
test.c
int array[] = {1,2,3};
Main.c
#include <stdio.h> extern int array[]; int array2[] = {1,2,3}; int main(void){ printf("array size is %d\n",(int)sizeof(array)); printf("array2 size is %d\n",(int)sizeof(array2)); return 0; }
出力
Main.c:9:44: error: invalid application of 'sizeof' to an incomplete type 'int []' printf("array size is %d\n",(int)sizeof(array)); ^~~~~~~ 1 error generated.
なぜ正しく配列のサイズが取得でいないのか
要素数を指定していないextern宣言した配列は不完全型であるため、 arrayにはsizeofを使うことができない。
不完全型とはなにか?
C言語の方は、大きく次の3つに分かれる。
- 関数型
- オブジェクト型
- 不完全型
不完全型には次のようなものがあります。
- メンバーがまだ指定されていない構造体型
- メンバーがまだ指定されていない共用体型
- 次元がまだ指定されていない配列型
今回は「次元がまだ指定されていない配列型」に該当するため、 配列のサイズを取得することができませんでした。
ちなみに、arrayのサイズはMain.cのコンパイル時に決定されるのですが。 不完全型のサイズは決定することができないため、コンパイルエラーとなりました。
回避方法
extern宣言の配列の要素数に正しい値を入れる
test.h
#define ARRAY_SIZE 3
test.c
#include "test.h" int array[ARRAY_SIZE] = {1,2,3};
Main.c
#include <stdio.h> #include "test.h" extern int array[ARRAY_SIZE]; int array2[] = {1,2,3}; int main(void){ printf("array size is %d\n",(int)sizeof(array)); printf("array2 size is %d\n",(int)sizeof(array2)); return 0; }
出力
array size is 12 array2 size is 12