假設我有以下結構:是否保證擦除填充區域的結構初始化爲零?
typedef struct
{
unsigned field1 :1;
unsigned field2 :1;
unsigned field3 :1;
} mytype;
前3位將是可用的,但sizeof(mytype)
將返回4
這意味着填充29個比特。 我的問題是,這些填充比特的標準保證是零通過的聲明初始化:
mytype testfields = {0};
或:
mytype myfields = {1, 1, 1};
這樣的,它是安全的假設進行以下memcmp()
那位4..29將爲零,因此不會影響比較:
if (memcmp(&myfields, &testfields, sizeof(myfields)) == 0)
printf("Fields have no bits set\n");
else
printf("Fields have bits set\n");
+1,有趣的是我沒有意識到這種變化。 – ouah
我想你應該添加C11段落的開頭*如果具有自動存儲持續時間的對象沒有被顯式初始化,它的值是不確定的。如果具有靜態或線程存儲持續時間的對象未被明確初始化,則:*這不能保證'mytype testfields = {0};'被設置爲'0'。 – ouah
@ouah,其實這似乎是一個漏洞,你是對的。我不認爲它是有意的,所以我會解釋一點。好點子。 –