簡體   English   中英

將結構初始化為 0

[英]Initializing a struct to 0

如果我有這樣的結構:

typedef struct
{
    unsigned char c1;
    unsigned char c2;
} myStruct;

將此結構初始化為 0 的最簡單方法是什么? 以下就夠了嗎?

myStruct _m1 = {0};

或者我是否需要將每個成員顯式初始化為 0?

myStruct _m2 = {0,0};

第一個是最簡單的(涉及較少的輸入),並且保證可以工作,所有成員都將設置為0 [Ref 1]
第二個更具可讀性。

選擇取決於用戶偏好或您的編碼標准要求的偏好。

[參考 1]參考 C99 標准 6.7.8.21:

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

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

如果數據是靜態或全局變量,默認情況下是零填充的,所以只需將其聲明為myStruct _m;

如果數據是局部變量或堆分配區域,請使用memset清除它,例如:

memset(&m, 0, sizeof(myStruct));

當前的編譯器(例如gcc最新版本)在實踐中對其進行了很好的優化。 這僅在所有零值(包括空指針和浮點零)都表示為全零位時才有效,這在我所知道的所有平台上都是正確的(但C標准允許實現為假;我不知道這樣的實現) .

您也許可以編寫myStruct m = {}; myStruct m = {0}; (即使myStruct的第一個成員不是標量)。

我的感覺是對局部結構使用memset是最好的,它更好地傳達了這樣一個事實,即在運行時必須做一些事情(而通常,全局和靜態數據可以理解為在編譯時初始化,在運行時沒有任何成本) )。

見§6.7.9 初始化:

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

所以,是的,他們都工作。 請注意,在 C99 中也可以使用一種新的初始化方式,稱為指定初始化:

myStruct _m1 = {.c2 = 0, .c1 = 1};

我也認為這會起作用,但它具有誤導性:

myStruct _m1 = {0};

當我嘗試這個時:

myStruct _m1 = {0xff};

只有第一個字節被設置為0xff ,其余的被設置為0 所以我不會養成使用它的習慣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM