亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C和C ++:自動結構的部分初始化

C和C ++:自動結構的部分初始化

C++ C
瀟瀟雨雨 2019-08-01 14:41:21
C和C ++:自動結構的部分初始化例如,如果somestruct有三個整數成員,我一直認為在C(或C ++)函數中執行此操作是可以的:somestruct s = {123,};第一個成員將初始化為123,最后兩個成員將初始化為0.我經常對自動數組執行相同的操作,寫入int arr[100] = {0,};以便將數組中的所有整數初始化為零。最近我在GNU C參考手冊中讀到:如果不初始化結構變量,則效果取決于它是否具有靜態存儲(請參閱存儲類說明符)。如果是,則使用0初始化具有整數類型的成員,并將指針成員初始化為NULL; 否則,結構成員的價值是不確定的。有人可以告訴我C和C ++標準對部分自動結構和自動數組初始化的看法嗎?我在Visual Studio中執行上述代碼沒有問題,但我希望與gcc / g ++兼容,也可能與其他編譯器兼容。謝謝
查看完整描述

3 回答

?
慕后森

TA貢獻1802條經驗 獲得超5個贊

鏈接的gcc文檔沒有談到部分初始化它只談到(完成)初始化沒有初始化。

什么是部分初始化?

標準沒有定義對象的部分初始化,要么是完全初始化,要么是無初始化。部分初始化是一種非標準術語,通常指的是您提供一些初始化器但不是全部的情況,即:初始化器的數量少于陣列的大小或初始化的結構元素的數量。

例:

int array[10] = {1,2};                    //Case 1:Partial Initialization

什么是(完整)初始化或無初始化?

初始化意味著在創建變量的同時為創建的變量提供一些初始值。即:在相同的代碼語句中。

例:

int array[10] = {0,1,2,3,4,5,6,7,8,9};    //Case 2:Complete Initializationint array[10];                            //Case 3:No Initialization

引用的段落描述了行為Case 3。

關于部分初始化(Case 1)的規則由標準很好地定義,并且這些規則不依賴于被初始化的變量的存儲類型。
AFAIK,所有主流編譯器都100%遵守這些規則。


有人可以告訴我C和C ++標準對部分自動結構和自動數組初始化的看法嗎?

C和C ++標準保證即使整數數組位于自動存儲上,并且如果括號括起的列表中的初始化程序較少,則必須將未初始化的元素初始化為0。

C99標準6.7.8.21

如果括號括起的列表中的初始值設定項少于聚合的元素或成員,或者用于初始化已知大小的數組的字符串文字中的字符數少于數組中的元素,則聚合的其余部分應為隱式初始化與具有靜態存儲持續時間的對象相同。


在C ++中,規則的陳述略有不同。

C ++ 03標準8.5.1聚合
第7段:

如果列表中的初始值設定項少于聚合中的成員,則未明確初始化的每個成員都應進行值初始化(8.5)。[例:

 struct S { int a; char* b; int c; };
 S ss = { 1, "asdf" };

初始化ss.awith 1,ss.bwith "asdf"ss.cwith表達式的表達式int(),即0。]

值初始化定義于,
C ++ 03 8.5 Initializers 
Para 5:

值初始化類型的物體T是指:
-如果T是一個類型(第9節)與用戶聲明的構造(12.1),然后對T中的默認構造函數被調用(以及初始化是形成不良的如果T沒有可訪問的默認構造函數); 
- 如果T是沒有用戶聲明的構造函數的非聯合類類型,則T的每個非靜態數據成員和基類組件都是值初始化的; 
- 如果T是數組類型,則每個元素都是值初始化的; 
- 否則,對象被零初始化


查看完整回答
反對 回復 2019-08-01
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

在C中,對象永遠不會被部分初始化 - 如果它們的任何部分被初始化,則初始化整個對象(以及遞歸的所有子對象)。如果沒有提供顯式初始化器,則將元素初始化為“適當類型的零”。

您的問題中的引用是指完全遺漏整個對象的初始化程序,而不是指子對象缺少初始化程序時。例如,假設arr具有自動存儲持續時間,那么:

int arr[100] = { 123 };

初始化arr[0]123與所有其他元素arr0。鑒于此:

int arr[100];

留下arr未初始化的每一個元素。引用的是后一種情況。


查看完整回答
反對 回復 2019-08-01
?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

最新的gcc版本也允許同時“部分”初始化和zeromem:

typedef struct{
  int a,b,c;}T;T s = {0, .b=5};

struct成員現在將具有以下值: a=0, b=5, c=0

我沒有關于其他編譯器是否允許這樣做的任何信息:p


查看完整回答
反對 回復 2019-08-01
  • 3 回答
  • 0 關注
  • 617 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號