2017-07-10 49 views
1

我正在執行我自己的一個類似於Linux的列表list.h,但不想打擾container_of的事。我可以安全地將第一個結構成員的地址解釋爲整個結構的地址嗎?

我讀過C編譯器不允許對結構成員重新排序,但有沒有保證第一個成員的偏移量始終爲零?

我可以直接施加一個限制:必須首先聲明列表頭成員才能通過將頭地址轉換爲容器類型來獲得整個結構成員?

+1

是第一個成員的偏移量必須始終爲零。任何可能的填充都是在*之後添加的*,所以下一個成員最終會有一個很好的偏移量。 –

+0

@Someprogrammerdude將是真實的,即使我找到無效地址上的結構?例如一個字大小的結構位於奇數地址 – CIsForCookies

+1

@CIsForCookies是。 – tilz0R

回答

6

C standard

6.7.2.1結構和聯合說明

15。在結構對象中,非位域成員和位域 所在的單元具有增加它們聲明順序的地址。 指向一個 結構對象,適當地轉換,點到其初始構件(或者,如果該部件是 位字段,然後在它所在的單元),反之亦然。在結構對象中可能存在未命名的 填充,但不在其開始處。

重點煤礦

相關問題