
No.3ベストアンサー
- 回答日時:
> 一括初期化関数でも作るしかなさそうですね
static変数を初期化用に用意しておくのはいかが?
http://oshiete.goo.ne.jp/qa/2658268.htmlより
>静的記憶域期間をもつオブジェクトを明示的に初期化しない場合、
>次の規定に従う。
>a) そのオブジェクトの型がポインタ型の場合、空ポインタに初期化する。
>b) そのオブジェクトの型が算術型の場合、(正または符号なしの)0に初期化する。
>c) そのオブジェクトが集成体の場合、各メンバにa)~d)の規定を(再帰的に)
>適用し初期化する。
>d) そのオブジェクトが共用体の場合、最初の名前つきメンバにa)~d)の規定を
>(再帰的に)適用し初期化する。
なので、zero初期化されていることが、規格で保証されます。
typedef struct hoge_struct
{
int a;
int b;
} hoge_struct;
static hoge_struct initializer; //初期化用変数。値は変えない。
int main(void)
{
hoge_struct hoge;
hoge = initializer;
return 0;
}
真っ白に何度も初期化したいなら、こんな感じでどうでしょう?
関数を用意して初期化すると、構造体のメンバが増えると関数も修正しないといけない
ですが、これだと関数を変更しなくてすむし。
No.6
- 回答日時:
> 構造体変数に {0} を代入すると
{0}を代入することは原則としてできませんが、initializer_listということなら可能です。
std::vector<int> v;
v = {0};
といったことができますから。
ただし、代入後は1要素だけになってしまいます。
(その構造体とやらをどんな仕様にするかにもよりますが...)
No.5
- 回答日時:
> {0}は何?
{0}で初期化というのは、C言語の時からある手法ですね。
なにやら予約語のようにも見えますが、ただのカッコ0です。
例えば、初期化済み配列を宣言するとします。
int a[2] = {1,2};
これはa[0]=1,a[1]=2で初期化されるのは分かりますよね。
では、数が合わないとき
int a[2] = {1};
こんなとき、不足分は0で初期化されることが規格で保証されています。
つまり、a[0]=1,a[1]=0ですね。
ですから、全て0で初期化する場合は、
int a[2] = {0};
とすれば良いわけです。
数が多くても、型が違っても同様です。
char buf[128] = {0}; // ゼロで初期化
このことを知っていると理解しやすいと思いますがいかがでしょう。
No.1
- 回答日時:
> 構造体変数に {0} を代入すると
代入の右辺に {0} はかけないと思うけど。少なくとも私の環境ではコンパイルエラーになる。
初期化なら右辺に {0} を書くことができる。
この違いは分かるかな?
> なんでこんなことが出来るのでしょう?
規格で決まっているから。
規格そのものの文章は知らないけど以下に説明があります。
http://www.kijineko.co.jp/node/681
有難うございます。初期化の時だけでしたね。
ループの中で一括で初期化できれば便利だと思ったのですが、
一括で初期値に戻すのは無理みたいです。
一括初期化関数でも作るしかなさそうですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
-
C言語での引数の省略方法
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
-
4
C++、クラスメンバの構造体配列の初期化について
C言語・C++・C#
-
5
CString から LPCTSTRの型に変換
C言語・C++・C#
-
6
char*を初期化したいのですが
C言語・C++・C#
-
7
戻り値を返す関数の前に(void)を付ける
C言語・C++・C#
-
8
C++のfor文について
C言語・C++・C#
-
9
デバッガでステップ実行している位置がずれる
C言語・C++・C#
-
10
C++でboolにintの値を代入することについて
C言語・C++・C#
-
11
【C#/Java?】try-catchでcatchせずにfinallyは一般的?
その他(プログラミング・Web制作)
-
12
構造体の静的な初期化
C言語・C++・C#
-
13
グローバル変数のよくない使い方とその改良例
C言語・C++・C#
-
14
C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して
C言語・C++・C#
-
15
静的でないメンバ関数の呼び出しが正しくありません
C言語・C++・C#
-
16
戻り値で構造体を返すことは可能でしょうか?
C言語・C++・C#
-
17
構造体のメンバ初期化について
C言語・C++・C#
-
18
C++ vectorに配列をプッシュしたい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAの変数のデータ型を変更する...
-
VBAのプログラムで、DIAG = 1# ...
-
VBAにてcolorindexを変数に格納...
-
関数から配列を返すには?
-
C言語 配列の長さの上限
-
c言語
-
C++DLLからC#へのコールバック...
-
データ数が多い場合のソート
-
CStringからchar*への型変換に...
-
c言語 構造体
-
n番目に大きい数を求めるアル...
-
リスト構造のソートで悩んでま...
-
C#で構造体の配列を持った構造...
-
C言語 ファイルの指定された行...
-
char gyou[1024];でcharの表現...
-
LGノートPCグラムについて
-
プログラムによく出てくるst...
-
配列の要素数に変数を入れたい...
-
C言語の配列のコピーについて
-
bmpやImageの配列を関数の引数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
VBAの変数のデータ型を変更する...
-
typedefをプログラム中で解除す...
-
値が代入されてない時
-
構造体のデータを丸ごとコピー...
-
VBAにてcolorindexを変数に格納...
-
整数から16進数への変換 現在c...
-
変数の初期化について
-
long型のデータをバイト型の配...
-
1バイトデータの読み出しについて
-
命名規則 VB 構造体
-
異なる構造体のデータのコピー
-
VBAで符号無し整数
-
C言語 構造体の中に共用体を定...
-
日付チェック関数について
-
構造体のポインタにNULLが入らない
-
ビット演算について
-
VBAで変数定義を変更する方法
おすすめ情報