[英]Are the members of a c struct guaranteed to be initialized to 0?
當我在C中聲明一個結構時,我保證會將成員初始化為某個特定值,例如0表示整數成員嗎?
編輯:
所以,假設我有一個看起來像這樣的結構:
typedef struct
{
int a;
} my_str;
我宣布:
my_str thing1;
全球。 根據一些答案,thing1.a將初始化為0 - 我是否理解正確?
只保證具有靜態存儲持續時間的變量(全局變量,函數中的靜態變量)初始化為0.沒有其他保證。
C99標准的相關部分:
第6.2.4節,§3:
標識符使用外部或內部鏈接聲明的對象,或者使用存儲類說明符static聲明的對象具有靜態存儲持續時間。 它的生命周期是程序的整個執行,它的存儲值只在程序啟動之前初始化一次。
第6.2.4節,§4:
聲明標識符沒有鏈接且沒有存儲類說明符靜態的對象具有自動存儲持續時間。
第6.2.4節,§5(關於具有自動存儲持續時間的對象):
對象的初始值是不確定的。 如果為對象指定了初始化,則每次在執行塊時達到聲明時都會執行初始化; 否則,每次達到聲明時,該值將變為不確定。
第6.7.8節,§10:
如果未顯式初始化具有自動存儲持續時間的對象,則其值不確定。 如果未顯式初始化具有靜態存儲持續時間的對象,則:
- 如果它有指針類型,則將其初始化為空指針;
- 如果它有算術類型,則初始化為(正或無符號)零;
- 如果是聚合,則根據這些規則初始化(遞歸)每個成員;
- 如果它是一個聯合,則根據這些規則初始化(遞歸)第一個命名成員。
從ANSI C標准 :如果沒有顯式初始化具有靜態存儲持續時間的對象,則會隱式初始化它,就好像每個具有算術類型的成員都被賦值為0,並且每個具有指針類型的成員都被賦予空指針常量。 如果未顯式初始化具有自動存儲持續時間的對象,則其值不確定
在C ++中,struct可以有一個帶有初始化列表的構造函數來執行自動初始化。
結構是數據類型,類型不確定初始化。 存儲類確定初始化。 所以struct類型的靜態分配對象會。 像任何其他靜態對象一樣,初始化為零。 使用static關鍵字聲明或在函數作用域外聲明的任何對象都是靜態分配的。
沒有。
例如,對於調試版本,MS VC ++編譯器會將struct成員初始化為零,並且不會為發布版本將成員初始化為零。
不,沒有這樣的保證。 如果希望將它們初始化為零,則幾乎需要手動完成,除非結構變量聲明為全局變量。
編輯:是的,我忘了在函數中提到靜態變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.