C 和C 中自動結構體和數組的部分初始化
這種誤解源於錯誤的假設,即自動結構體和數組的部分初始化在C 中是允許的。與此信念相反,標準明確定義了僅兩種情況:完全初始化或不初始化初始化。
部分初始化
標準中未定義術語「部分初始化」。它指的是僅初始化結構體或陣列中的成員子集。
完全初始化
當結構體或陣列的所有成員都明確初始化時,就會發生完全初始化。例如:
struct somestruct { int a; int b; int c; }; somestruct s = {1, 2, 3};
無初始化
未提供初始化時,行為取決於變數的儲存類型:
部分實踐中的初始化
儘管不是標準行為,但自動結構和數組成員的部分初始化是大多數編譯器都支持,包括Visual Studio 和gcc/g 。
C 標準(C99)
第6.7.8.21 節初始化
如果提供的初始值設定項少於聚合中元素或成員的數量,則剩餘元素為初始化為0。
C 標準(C 03)
第8.5.1 節聚合
如果有較少的初始化器,未初始化的成員被值初始化。值初始化因物件類型而異。例如,非聯合類別類型的非靜態資料成員是值初始化的,而整數等基本型別是零初始化的。
結論
部分自動結構和陣列的初始化是一種非標準行為,如果處理不當,可能會導致未定義的結果。為了確保可移植性和正確性,請務必確保完全初始化或不初始化。
以上是是否允許和定義 C 和 C 中自動結構和陣列的部分初始化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!