【C言語】ポインタ(12)インコンプリート型: 中身の要素が不明な共用体

どうも。gochaです。

中身の要素が不明な共用体も、インコンプリート型の一種です。

当たり前と思われるかもしれませんが、内部の要素が確定してから初めてサイズが確定します(つまり、デフォルトで何かサイズを確定してくれるわけではない)。

コードを示します。

リストが定義されていないため型が確定できていない共用体を含むプログラム、incomplete-union.c

#include <stdio.h>

int main (void)
{
        union union1 u_test1;
        union union2 u_test2;

        printf ("size of union1 is %d\n", sizeof(u_test1));
        union union3 {
                char c ;
                int i ;
        } u_test3 ;

        union union2  { char c; int i;} u_test2;

        printf ("size of union2 is %ld\n", sizeof(u_test2));
        printf ("size of union3 is %ld\n", sizeof(u_test3));

        printf ("u_test3.c is %d\n", u_test3.c);
        printf ("u_test3.i is %d\n", u_test3.i);

        u_test3.c = 10;

        printf ("size of union3 is %ld\n", sizeof(u_test3));
        printf ("u_test3.c is %d\n", u_test3.c);
        printf ("u_test3.i is %d\n", u_test3.i);

        u_test3.i = 260;
        printf ("size of union3 is %ld\n", sizeof(u_test3));
        printf ("u_test3.c is %d\n", u_test3.c);
        printf ("u_test3.i is %d\n", u_test3.i);
        return 0;
}

incomplete-union.c のコンパイル結果

$ gcc incomplete-union.c 
incomplete-union.c: In function ‘main’:
incomplete-union.c:5:15: error: storage size of ‘u_test1’ isn’t known
  union union1 u_test1;
               ^
incomplete-union.c:6:15: error: storage size of ‘u_test2’ isn’t known
  union union2 u_test2;
               ^

型の確定していない共用体をコメントアウトした incomplete-union2.c

#include <stdio.h>

int main (void)
{
/*
	union union1 u_test1;
	union union2 u_test2;
	printf ("size of union1 is %d\n", sizeof(u_test1)); 
*/

	union union3 {
		char c ;
		int i ;
	} u_test3 ;

	union union2  { char c; int i;} u_test2;

	printf ("size of union2 is %ld\n", sizeof(u_test2)); 
	printf ("size of union3 is %ld\n", sizeof(u_test3)); 

	printf ("u_test3.c is %d\n", u_test3.c); 
	printf ("u_test3.i is %d\n", u_test3.i); 

	u_test3.c = 10;

	printf ("size of union3 is %ld\n", sizeof(u_test3)); 
	printf ("u_test3.c is %d\n", u_test3.c); 
	printf ("u_test3.i is %d\n", u_test3.i); 

	u_test3.i = 260;
	printf ("size of union3 is %ld\n", sizeof(u_test3)); 
	printf ("u_test3.c is %d\n", u_test3.c); 
	printf ("u_test3.i is %d\n", u_test3.i); 
	return 0;	
}

incomplete-union2.c のコンパイル、実行結果。

$ gcc incomplete-union2.c 
demo@ubuntu:~/SelfStudy/c/pointers/ImcompleteType/enumarator$ ./a.out 
size of union2 is 4
size of union3 is 4
u_test3.c is -64
u_test3.i is -396685376
size of union3 is 4
u_test3.c is 10
u_test3.i is -396685558
size of union3 is 4
u_test3.c is 4
u_test3.i is 260

以上、共用体において、いつ型確定が実施されるのか?でした。

今回はここまで。