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