来自 C 标准(“第 6.2.5 节类型”):
...数组类型描述了一组连续分配的非空对象...
数组将在“内存”中连续分配。
Eric 和 Interjay 在说什么,这是我最初写这篇文章时没有考虑到的,所以感谢 Eric 和 Interjay,这仅适用于虚拟内存地址。
您的机器和操作系统很可能使用内存管理单元 (MMU),它创建一个虚拟地址空间(您正在工作的地方)并将其映射到块大小的块(页面)中的物理内存上。
所以 Eric 和 Interjay 的意思是,尽管虚拟地址是连续的,但它们映射到的物理内存块可能位于不同的地址。
Virtual Physical
+----------+ +----------+
| | |
| VMA pg 1 |---------->| PMA 88 (VMA1)
| | |
+----------+ +----------+
| |\ ...
| VMA pg 2 | \ ...
| | \ ...
+----------+ \ ...
\ \ ... big gap in physical
\ \ ... memory
\ \ ...
\ \ ...
\ >--+----------+
\ |
\ | PMA 999 (VMA2)
\ |
>-+----------+
因此,对于小型数组(小于页面大小),这可能适用于 VMA 和 PMA 地址,尽管很可能 PMA != VMA。对于大于页面大小的数组,虽然 VMA 看起来是连续的,但 PMA 很可能是不相交且无序的,如上图试图显示的......
另外,我认为 Interjay 和 Eric 更进一步,说任何 C 地址,虽然在 C 模型中是连续的,但可能在内存中的任何地方。尽管这不太可能,因为大多数操作系统都实现了某种分页来获得虚拟到物理的映射,但从技术上讲,我认为可能是这种情况……学习考虑这一点很好,所以感谢小伙子 :)