2017-03-07 114 views
1

如果我有一個只包含短無符號整數的結構,它將存儲在相同大小的連續內存位置;如果我有一個無符號短整型數組,也是如此。他們怎麼會有什麼不同?它是如何訪問?我知道,通過使用指針來引用數組的起始值來訪問數組,而數組運算符則設置了該內存位置的偏移量,這是否也適用於結構或是通過使用每個塊的內存位置來訪問的結構體數據的?相同數據類型的結構和數組之間的區別是什麼?

+2

不同之處在於,您不控制可能/可能不會添加到結構中的填充(無需提供某些預處理器指令)。數組只是* shorts的* x-number *,'struct'是加上所有填充。 –

+1

可以從函數傳遞/返回'struct'。數組不能。 – chux

+0

因此,假設我想從函數傳遞一系列沒有填充的連續內存位置,我需要做什麼? –

回答

2

不,他們不需要是相同的,最有可能的,他們不是。

在結構構件的情況下,構件之間可以有填充。因此,不能保證連續的成員將駐留在連續的內存中。在這種情況下,基於實現,使用第一個元素的地址的指針算術可能會或可能不會工作有效。

引用的C11標準,章§6.7.2.1/ P15,結構和聯合說明有關部分,

[..]可以有一個結構對象內無名 填充,但不是在其開始。

章§6.5.3.4,sizeof操作者,

[...]當 應用於具有結構或聯合類型的操作數,其結果是總數在這樣一個對象中包含 字節,包括內部和尾部填充。

但是,如果是數組,則所有成員都保證位於連續內存中,並且指針運算是確定性的。

+0

「*不,它們不必是相同的*」 - 同意「*並且很可能,它們不是*」 - 最有可能它們*是*。一個結構的成員都是相同的類型將很可能連續分配它們。但如果編譯器決定對結構進行更嚴格的對齊而不是其成員,那麼最後可能會出現填充。 –

相關問題