如果我有一個只包含短無符號整數的結構,它將存儲在相同大小的連續內存位置;如果我有一個無符號短整型數組,也是如此。他們怎麼會有什麼不同?它是如何訪問?我知道,通過使用指針來引用數組的起始值來訪問數組,而數組運算符則設置了該內存位置的偏移量,這是否也適用於結構或是通過使用每個塊的內存位置來訪問的結構體數據的?相同數據類型的結構和數組之間的區別是什麼?
1
A
回答
2
不,他們不需要是相同的,最有可能的,他們不是。
在結構構件的情況下,構件之間可以有填充。因此,不能保證連續的成員將駐留在連續的內存中。在這種情況下,基於實現,使用第一個元素的地址的指針算術可能會或可能不會工作有效。
引用的C11
標準,章§6.7.2.1/ P15,結構和聯合說明有關部分,
[..]可以有一個結構對象內無名 填充,但不是在其開始。
和
章§6.5.3.4,sizeof
操作者,
[...]當 應用於具有結構或聯合類型的操作數,其結果是總數在這樣一個對象中包含 字節,包括內部和尾部填充。
但是,如果是數組,則所有成員都保證位於連續內存中,並且指針運算是確定性的。
+0
「*不,它們不必是相同的*」 - 同意「*並且很可能,它們不是*」 - 最有可能它們*是*。一個結構的成員都是相同的類型將很可能連續分配它們。但如果編譯器決定對結構進行更嚴格的對齊而不是其成員,那麼最後可能會出現填充。 –
相關問題
- 1. cl_datatype和通常數據類型之間的區別是什麼
- 2. 數據/類型構造函數和函數之間的區別?
- 3. 創建結構的「數據」和「類型」有什麼區別?
- 4. 數據結構Tree和Graph之間有什麼區別?
- 5. 析構函數和函數之間的區別是什麼?
- 6. (類型)值和類型(值)之間的區別是什麼?
- 7. 數據模型和數據結構有什麼區別?
- 8. 結構和類之間的區別?
- 9. 什麼是數據結構添加不同類型的數據?
- 10. 用malloc分配數組類型和數組之間的區別
- 11. Java中數據類型和文字之間的區別是什麼?
- 12. 結構和列表ADT之間的用法區別是什麼?
- 13. bash數組 - $ {#array_name [*]}和$ {#array_name [@]}之間的區別是什麼
- 14. 抽象數據類型和代數數據類型之間的區別
- 15. MVC和MVVM之間的區別和相似之處是什麼?
- 16. dropbox,插入和數據存儲之間的區別是什麼
- 17. MediaFoundation RGB數據和BMP之間的區別究竟是什麼?
- 18. 什麼是兩個語句之間的區別... context.getImageData()。數據和
- 19. TEXT和VARCHAR數據字段之間的區別是什麼?
- 20. 類型巴貝爾和jsx之間的區別是什麼
- 21. 對象,*和沒有類型之間的區別是什麼?
- 22. 什麼是REBOL結構!數據類型?
- 23. 不同類型的Key Valye數據庫之間的區別
- 24. Android體系結構組件中AndroidViewModel和ViewModel之間的區別是什麼?
- 25. 原始數組和引用數組之間有什麼區別?
- 26. jquery中的數據和數據類型有什麼區別?
- 27. Haskell中的類型和數據類型有什麼區別?
- 28. 類型和類之間的數據存儲區別
- 29. Kotlin中的列表和數組類型之間的區別
- 30. $(())和expr之間的區別是什麼?
不同之處在於,您不控制可能/可能不會添加到結構中的填充(無需提供某些預處理器指令)。數組只是* shorts的* x-number *,'struct'是加上所有填充。 –
可以從函數傳遞/返回'struct'。數組不能。 – chux
因此,假設我想從函數傳遞一系列沒有填充的連續內存位置,我需要做什麼? –