2011-04-06 66 views
1

在玩過不同的數組類型後,我確定每個元素都需要2個「填充」位。例如,如果數組的數據類型爲.int(32位或2^5),則總共有4個專用於陣列的每個元素的存儲位置(總共2^7位)。另一個例子是,如果數據類型是.short(16位或2^4),那麼數組中的每個元素包含64位(2^6)陣列內存佈局

下面是一個示例。

.data 
IntArray: 
.int 10, 20, 30, 40, 50 

(gdb) info variables 
0x080490a4 IntArray 

(gdb) x/1wt 0x080490a4 
0x80490a4 : 00000000000000000000000000001010 
(gdb) x/1wt 0x080490a5 
0x80490a5 : 00010100000000000000000000000000 
(gdb) x/1wt 0x080490a6 
0x80490a6 : 00000000000101000000000000000000 
(gdb) x/1wt 0x080490a7 
0x80490a7 : 00000000000000000001010000000000 
(gdb) x/1wt 0x080490a8 
0x80490a8 : 00000000000000000000000000010100 

很明顯,內存位置0x080490a4包含數組的第一個元素(值爲10)。同樣顯而易見的是,內存位置0x080490a8包含該數組的第二個元素。

我的問題涉及0x080490a5,0x080490a6,0x080490a7的內容。這些內存位置的意義是什麼?我忽略了關於數組如何操作的一些細節?

+0

我有點困惑,但我只是想確保我們在同一頁面上。 「2位'填充'」是什麼意思? – Matt 2011-04-06 02:18:46

回答

0

每個數組元素的大小有什麼也沒有與數組中元素的數量有關。它僅由存儲在數組中的數據類型決定。如果您有int[],則每個數組元素將與int一樣大。另一方面,int的大小取決於操作系統和硬件平臺ABI,在大多數計算機系統上它可能會遇到32位。

要計算每個數組的大小,您必須將每個元素的大小乘以元素的數量。因此,對於你的int a[4]的例子:

size = sizeof(int) * 4 = 32 * 4 bits = 2^5 * 2^2 bits = 2^7 bits = 128 bits = 16 bytes 

陣列,而不是每個元素的大小。

現在,x/1wt GDB命令顯示存儲在提供的adddress中的的內容。只要地址指向一個數組元素,你應該看到它的內容。但是當你從一個元素到下一個元素時,你需要在每個元素中添加字節數,而不是將位置移動一個字節。在你的情況:

  • 0x080490a4是第一個數組元素
  • 0x080490a8的地址的第二個數組元素的
  • 0x080490a50x080490a60x080490a7是該地址的所有非對齊(即它們是不是一個字大小的多倍)地址,每個地址指向4個字節。在這4個字節中,一部分屬於第一部分,另一部分屬於第二部分。

由於這樣的事實,x86處理器是little-endian,其中至少顯著字節(LSB)至上,在這兩個元件的物理存儲器中的佈局將是:

0x080490a4: 00001010 00000000 00000000 00000000 
0x080490a8: 00010100 00000000 00000000 00000000 

通過增加一個字節的地址,你的計算機看到:

0x080490a5: 00000000 00000000 00000000 00010100 
0x080490a9: 00000000 00000000 00000000 ... 

iee存儲在0x080490a5的值有:

  • 作爲其三個至少顯著字節,第一個數組元素

  • 作爲其最顯著字節的第一個字節(的三個最顯著字節即至少顯著一個)所述第二陣列元件的

而且,由於是86小端和GDB重新排列它示出了字節,使得MSB首先示出,將得到:

0x80490a5: 00010100 00000000 00000000 00000000 
+0

謝謝你的解釋。我認爲我的大部分困惑來自於我,雖然每個32位內存地址指向32位,但現在我明白它只指向8位。 事情更加清晰 - 關於在裝配上學習更多。 – gnalsa 2011-04-10 17:20:34