構造体の静的な初期化で、初期化が書かれていないメンバーは、
どうなるのでしょうか。。?
たとえば・・・
// 構造体の宣言
strcut MY_STRUCT {
int data1 ;
int data2 ;
int data3 ;
int data4 ;
} ;
// 変数宣言&初期化
static strcut MY_STRUCT st = {
.data1 = 100,
.data3 = 300
} ;
ネットで調べると、
初期化で指示されていないメンバーは0に初期化される、
という記述も一つだけ見つけたのですが・・・これはC言語(C99)の仕様でしょうか?
それともコンパイラ依存の仕様でしょうか?
No.4ベストアンサー
- 回答日時:
#2, #3 の方、この初期化の方法は C99で導入されたもので
gcc固有の拡張ではありません。
単にVC++などがC99の規格を満たしていないだけです。
質問者さんへ。
どうせネットで探すのなら原規格をあたるべきでしょう。
こういうところで訊いても所詮二次情報なので、
(わたしも含め)回答者が勘違いしていたり
無知のために
間違った回答をすることが少なくありません。
C99 は JIS規格 X 3010 になっていますので、
ネット上でpdfのものを参照することができます(ただし、保存も
印刷もできません。規格書を買えば別ですが)。
とりあえず今回の質問に関連するところを抜き出して引用します。
X 3010 6.7.8 初期化
要素指示子が
.識別子
という形式の場合、現オブジェクトは構造体型または共用体型をもち、
識別子はその型のメンバ名でなければならない。
意味規則
自動記憶域期間をもつオブジェクトを明示的に初期化しない場合、
その値は不定とする。
静的記憶域期間をもつオブジェクトを明示的に初期化しない場合、
次の規定に従う。
a) そのオブジェクトの型がポインタ型の場合、空ポインタに初期化する。
b) そのオブジェクトの型が算術型の場合、(正または符号なしの)0に初期化する。
c) そのオブジェクトが集成体の場合、各メンバにa)~d)の規定を(再帰的に)
適用し初期化する。
d) そのオブジェクトが共用体の場合、最初の名前つきメンバにa)~d)の規定を
(再帰的に)適用し初期化する。
原文を読みたいのであれば、
日本工業標準調査会のページ
http://www.jisc.go.jp/
にアクセスし、ウィンドウの右の方にある
「JIS 検索」のリンクをクリックして
該当の規格を検索してください。
今回は規格番号がわかっているので、
一番上の 「JIS規格番号からJISを検索」で
テキストボックスに X3010を入力して検索すれば
一発ででます。
pdfファイルへのリンクは毎回変わるので直接示すことができません。
面倒ですが検索からやってください。
参考URL:http://www.jisc.go.jp/
なるほど!
動的変数では明示的に初期化しなかったメンバは不定、
静的変数ではNULLか0に初期化される、ということなのですね。
CにJIS規格があるとは、知りませんでした。
原本をあたってみようと思います。
ありがとうございました!
No.3
- 回答日時:
ちなみに
static strcut MY_STRUCT st = {
.data1 = 100,
.data3 = 300
} ;
という初期化形式は gcc の拡張構文だったはずです。
Windows系のコンパイラ(VisualC++やIntelC、BCC)ではコンパイルがとおりません。
No.2
- 回答日時:
えっと、ご質問の回答は#1さんが示されている通りです。
そのほかにちょっと気になったことが。
> static strcut MY_STRUCT st = {
> .data1 = 100,
> .data3 = 300
> } ;
これ、正しく初期化できますか?
(そもそもコンパイルが通らない気もしますけど、仮に通ったことにしましょう)
printf("%d, %d, %d, %d\n", st.data1, st.data2, st.data3, st.data4);
とかするとdata1に100が、data2に300が入ってたりしませんか?
No.1
- 回答日時:
★規格上で初期化されます。
・コンパイラ依存の仕様ではありません。
・あと『変数宣言&初期化』ではなく『変数定義&初期化』ですよ。
・『宣言』と『定義』の区別をつけましょう。
・ネットで調べたとおり、初期化の指示がないメンバーは 0 に初期化されます。
・どれも指示がなければ、すべてのメンバーが 0 に初期化されます。
・以上。おわり。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# 配列の初期化についてです。 int 例のプログラムで int x[5]={1,2,3,4,5}; x 1 2022/05/29 15:00
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アクセスVBAのMe!と[ ]
-
文字列で小数点以下の0を削除し...
-
VBA エンターキーでイベントに...
-
Excel VBAでマウスの左クリック...
-
Excel2007 でのチェックボック...
-
Access からオブジェクトとして...
-
現在アクティブになっているオ...
-
ユーザーフォームのインポート...
-
PowerpointVBAで指定のShapeオ...
-
[C#] DataGridViewの項目名
-
日本語の文字化けを直す方法
-
エクセルVBAでセル番地を指定し...
-
エクセルのデータをwebフォーム...
-
コードでオブジェクトを最前面に
-
Excel VBA でPictureBoxオブジ...
-
Imageコントロールにグラフを表...
-
エクセルVBA初心者です。オブジ...
-
生成AI画像について
-
「ご処理進めて頂きますようお...
-
メルカリのメルカードで買い物...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アクセスVBAのMe!と[ ]
-
VBA エンターキーでイベントに...
-
Excel VBAでマウスの左クリック...
-
文字列で小数点以下の0を削除し...
-
【エクセルのマクロ】クリップ...
-
エクセルVBAでセル番地を指定し...
-
Excel2007 でのチェックボック...
-
Accessのフォーム上にエクセル...
-
日本語の文字化けを直す方法
-
エクセルのデータをwebフォーム...
-
現在アクティブになっているオ...
-
PowerpointVBAで指定のShapeオ...
-
コードでオブジェクトを最前面に
-
【エクセル】複数のTextBoxに共...
-
Imageコントロールにグラフを表...
-
ユーザーフォームのインポート...
-
Access からオブジェクトとして...
-
構造体の静的な初期化
-
「SHDocVw」の意味
-
Excel VBA でPictureBoxオブジ...
おすすめ情報