Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 阵列内存布局_Arrays_Memory_Layout - Fatal编程技术网

Arrays 阵列内存布局

Arrays 阵列内存布局,arrays,memory,layout,Arrays,Memory,Layout,在使用了不同的数组类型之后,我确定每个元素需要2位“填充”。例如,如果数组的数据类型为.Int32位或2^5,则总共有4个内存位置,总共有2^7位专用于数组的每个元素。另一个示例是,如果数据类型为.short16位或2^4,则数组的每个元素都包含64位2^6 这里有一个例子 .data IntArray: .int 10, 20, 30, 40, 50 (gdb) info variables 0x080490a4 IntArray (gdb) x/1wt 0x080490a4 0x8049

在使用了不同的数组类型之后,我确定每个元素需要2位“填充”。例如,如果数组的数据类型为.Int32位或2^5,则总共有4个内存位置,总共有2^7位专用于数组的每个元素。另一个示例是,如果数据类型为.short16位或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包含arrayvalue 10的第一个元素。很明显,内存位置0x080490a8包含数组的第二个元素


我的问题涉及0x080490a5、0x080490a6、0x080490a7的内容。这些内存位置的意义是什么?我是否忽略了数组操作的一些细节?

每个数组元素的大小与数组中元素的数量无关。它仅由存储在数组中的数据类型确定。如果您有一个int[],则每个数组元素都将与int一样大。另一方面,int的大小取决于操作系统和硬件平台,并且在大多数计算机系统上可能会遇到32位

要计算每个数组的大小,必须将每个元素的大小乘以元素的数量。因此,对于int a[4]的例子:

数组的大小,而不是每个元素的大小

现在,x/1wt GDB命令显示存储在提供的addAddress中的单词的内容。只要地址指向数组元素,就应该看到它的内容。但是,当您从一个元素转到下一个元素时,需要在每个元素中添加字节数,而不是将位置移动一个字节。就你而言:

0x080490a4是第一个数组元素的地址 0x080490a8是第二个数组元素的地址 0x080490a5、0x080490a6和0x080490a7都是非对齐的,即它们不是每个指向4字节的字大小地址的倍数。在这4个字节中,有些属于第一个,有些属于第二个元素。 由于x86 CPU是,其中最低有效字节LSB位于第一位,因此这两个元素在物理内存中的布局将是:

0x080490a4: 00001010 00000000 00000000 00000000
0x080490a8: 00010100 00000000 00000000 00000000
通过将地址增加一个字节,您的计算机可以看到:

0x080490a5: 00000000 00000000 00000000 00010100
0x080490a9: 00000000 00000000 00000000 ...
即,存储在0x080490a5中的值具有:

作为其三个最低有效字节,第一个数组元素的三个最高有效字节

第一个字节作为其最高有效字节,即第二个数组元素的最低有效字节

由于x86是little endian,GDB会重新排列它所显示的字节,以便首先显示MSB,因此您会得到:

0x80490a5: 00010100 00000000 00000000 00000000

我有点困惑,但我只是想确定我们的观点是一致的。2位“填充”是什么意思?谢谢你的解释。我想我最困惑的地方是我,虽然每个32位内存地址都指向32位,但现在我知道它只指向8位。事情变得更清楚了——关于组装的更多学习。
0x80490a5: 00010100 00000000 00000000 00000000