C言語 - 構造体の初期化

クラウディア 
1. 概要
2. 暗黙のコンストラクタ・明示的コンストラクタによる違い

1. 概要

 この項は、C言語でなく、「C++」の言語仕様になります。  「C/C++」に関しては、人に教えるくらいはできると思っていますが・・・。  まだまだ、甘いといいますか、知らない言語仕様がありました。

2. 暗黙のコンストラクタ・明示的コンストラクタによる違い

 下記のようなソースを書いていて
#include <stdio.h>

struct Hoge
{
	int  i;
	char c;
	char dummy[3];
};

int main(int argc, char* argv[])
{
	struct Hoge hoge = Hoge();
	struct Hoge fuga;

	printf("hoge i -> %d\n", hoge.i);
	printf("hoge c -> %d\n", hoge.c);

	printf("fuga i -> %d\n", fuga.i);
	printf("fuga c -> %d\n", fuga.c);

	return 0;
}

 実行した場合、15~16行の出力も、18~19行の出力も、同じようなもの(不定値になるので何が出力されるのかわからん)になると思っておりました。  あにはからんや・・・。  実行してみると・・・。
hoge i -> 0
hoge c -> 0
fuga i -> -5168
fuga c -> -1
 これは、12行目と、13行目の宣言の違いによるものだそうで・・・。  12行目は、明示的にコンストラクタを呼んでいるために、初期化が働いて、0 になるそうなのです。  13行目は、暗黙のコンストラクタになっているため、初期化されることはなく不定値がはいったままになるそうです。  まぁ、この場合も
#include <stdio.h>

struct Hoge
{
	int  i;
	char c;
	char dummy[3];
};

int main(int argc, char* argv[])
{
	struct Hoge hoge = Hoge();
	struct Hoge fuga = {};

	printf("hoge i -> %d\n", hoge.i);
	printf("hoge c -> %d\n", hoge.c);

	printf("fuga i -> %d\n", fuga.i);
	printf("fuga c -> %d\n", fuga.c);

	return 0;
}

 のように明示的に初期化を行えば、以下の結果が得られるわけですが・・・。
hoge i -> 0
hoge c -> 0
fuga i -> 0
fuga c -> 0
ハイスピードプラン