2013-05-06 449 views
3

假設我有以下的數組:數組的元素是否保證從低地址到高地址存儲?

int list[3]={2,8,9}; 
printf("%p,%p,%p",(void*)&list[0],(void*)&list[1],(void*)&list[2]); 

是否總是保證&列表[0] < &列表[1] < &表[2]

我曾以爲這是一個硬性規定,而使用C,但現在必須非常肯定它作爲OP剛纔問我這件事時,我回答了他的問題有關endianness

Little endian or Big endian

是什麼給了我第二個想法是stacks can grow up or down issue.I不是很肯定,如此你的嚴謹的答案是appreciated.Thanks。

+1

'&的情況下( list [n])'是我認爲每個標準相當於'list + n'。 C中的數組索引表示法不過是將值添加到指針的簡寫。內存保留的方式可以確保'+'的工作原理 – wirrbel 2013-05-06 11:00:54

+0

您是在問C中的事物是如何出現的,或者它們是如何在內存中出現的? – 2013-05-06 11:06:00

+0

@EricPostpischil給我你的意見對兩者簡單地說,通過comment.Though我更感興趣的有關實際內存。 – 2013-05-06 11:23:13

回答

5

是的,它是保證&list[0]<&list[1]&list[1]<&list[2]。當比較指向同一數組的元素的指針時,指向具有較大下標的元素的指針將被視爲具有較大的值。這在C99 [email protected]指定:

指針數組元素與較大的下標值比指針到具有較低下標相同的陣列的元件大於比較值

然而,它不是保證通過的printf與%p打印的值也將遵循同樣的順序 - 這些值是實現定義的。

+0

你的答案與Eric Postpischil的矛盾嗎?請給出更多的細節,你們倆。 – 2013-05-06 10:59:18

4

如果正在詢問存儲器如何出現在C型的內部,然後陣列出現是在C代碼連續的,並且所述C表達式&list[0] < &list[1]是真實的。

如果你問有關如何實際內存C實現內出現時,C標準並不要求在存儲陣列中的任何特殊安排。大多數C實現對數組使用連續的上升虛擬內存,但降序地址是一個簡單的變化。並且,在物理內存的水平,陣列通常不是連續的,因爲從虛擬內存到物理存儲器中的映射由操作系統基於不管它具有可用和處理的執行期間甚至可能改變來確定。

另外,存在不保證由%p打印的字符串是存儲器地址。

+0

只有元素將被存儲在連續的地點呃? – 2013-05-06 10:56:17

+0

如果高於或低於較高地址,無關緊要嗎? – 2013-05-06 10:56:37

+0

@Rüppell'sVulture:不,C標準不保證數組元素連續存儲。它只需要C模型內的指針增量指向連續的數組元素。從C指針到機器地址的映射是C實現。 – 2013-05-06 10:58:21

4

從C標準( 「第6.2.5節類型」):

...數組類型描述了一種連續地分配非空的一組對象...

陣列將在「記憶」中連續分配。

埃裏克和Interjay在說什麼,這是我最初寫這個時沒有考慮的東西,所以謝謝Eric和Interjay,是這隻適用於虛擬內存地址。

你的機器和操作系統很可能會使用它創建了一個虛擬地址空間(在您的工作)和塊大小的塊(頁)映射到這個物理內存的內存管理單元(MMU)。

所以埃裏克和Interjay說的是,雖然虛擬地址將是連續的物理內存塊,他們映射到可能在不同地址。

Virtual    Physical 
+----------+   +----------+ 
|   |   | 
| VMA pg 1 |---------->| PMA 88 (VMA1) 
|   |   | 
+----------+   +----------+ 
|   |\   ... 
| VMA pg 2 | \   ... 
|   | \   ... 
+----------+ \  ... 
      \ \  ... big gap in physical 
       \ \  ... memory 
       \ \  ... 
       \ \ ... 
       \ >--+----------+ 
        \ | 
        \ | PMA 999 (VMA2) 
        \ | 
        >-+----------+ 

因此,對於小數組(比頁面大小更小),這可能是既VMA和PMA地址如此,儘管最有可能的PMA!= VM​​A。對於大於頁面大小的數組,雖然VMA看起來是連續的,但PMA很可能會脫節並且失序,如上圖試圖展示的那樣...

另外,我認爲Interjay和Eric會更進一步,稱任何C地址儘管在C模型中都是連續的,但可能在內存中的任何地方。雖然這是不可能的,因爲大多數操作系統的執行某種尋呼獲得虛擬到物理映射,它可以在技術上是我想......這是很好的學習考慮,所以感謝傢伙:)