【C言語】ポインタ(9)インコンプリート型:要素数やサイズの決まっていない配列型

どうも。gochaです。

インコンプリート型の次の例として、

要素数やサイズの決まっていない配列型

について説明します。

22. An array type of unknown size is an incomplete type.

It is completed, for an identifier of that type, by specifying the size in a later declaration (with internal or external linkage).

参照:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf#page=48

日本語訳です。

22. サイズの決まっていない配列型は、インコンプリート型である。

インコンプリート型の識別子は、あとの宣言で、インターナルリンクエージ、もしくはエクスターナルリンクエージを使ってサイズが特定された時に、完成される。

インコンプリート型の定義とあわせてみると、サイズの決まっていない配列型は、オブジェクトのサイズを決定できない型である。

という当たり前の話になってしまいますね。

補足すると、例えば、要素数の決まっていないint 型 配列を宣言したときには配列要素数が決まるまで当該配列のサイズが決めれないということを述べています。

インコンプリート型の識別子については、インターナルリンクエージやエクスターナルリンクエージというものを使って、後でサイズ確定ができるケースがあるということさえ分かっていれば良いと思います。

インターナルリンクエージや、エクスターナルリンクエージに関しては、今は飛ばしておきますが、確認したい場合はpage 42 で確認できます。

念のため、下記に2つのプログラムを示します。

インコンプリートタイプでsizeofを使おうとして、サイズが確定していないのでエラーになるプログラム 1.c

#include <stdio.h>
int a[];
int main ( void ) {

	printf("size of a is %d\n",sizeof(a));

	int a[3];

	a[0] = 0;
	a[1] = 1;
	a[2] = 2;


	printf("a[0] is %d\n",a[0]);
	printf("a[1] is %d\n",a[1]);
	printf("a[2] is %d\n",a[2]);

	printf("size of a is %d\n",sizeof(a));
	return 1;

}

1.c のコンパイル結果

$ gcc 1.c 
1.c: In function ‘main’:
1.c:5:35: error: invalid application of ‘sizeof’ to incomplete type ‘int[]’
  printf("size of a is %d\n",sizeof(a));
                                   ^
1.c:18:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
  printf("size of a is %d\n",sizeof(a));
  ^
1.c: At top level:
1.c:2:5: warning: array ‘a’ assumed to have one element [enabled by default]
 int a[];
     ^

インコンプリートタイプの要素数が決まってからsizeofを呼ぶようにしたプログラム2.c

#include <stdio.h>
int a[];
int main ( void ) {

//printf("size of a is %d\n",sizeof(a));  

	int a[3];

	a[0] = 0;
	a[1] = 1;
	a[2] = 2;


	printf("a[0] is %d\n",a[0]);
	printf("a[1] is %d\n",a[1]);
	printf("a[2] is %d\n",a[2]);

	printf("size of a is %d\n",sizeof(a));
	return 1;

}

2.c のコンパイル、および実行結果

$ gcc 2.c
2.c: In function ‘main’:
2.c:18:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
  printf("size of a is %d\n",sizeof(a));
  ^
2.c: At top level:
2.c:2:5: warning: array ‘a’ assumed to have one element [enabled by default]
 int a[];
     ^
demo@ubuntu:~/SelfStudy/c/pointers/ImcompleteType$ ./a.out 
a[0] is 0
a[1] is 1
a[2] is 2
size of a is 12

上記実施した動画をyoutubeに載せてみました。

今回はここまで。