Размер каждого элемента массива не имеет ничего общего с количеством элементов в массиве.Он определяется только типом данных, которые хранятся в массиве.Если у вас есть 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 показывает содержимое слова , которое хранится в предоставленном адресе.Пока адрес указывает на элемент массива, вы должны видеть его содержимое.Но когда вы переходите от одного элемента к другому, вам нужно добавить количество байтов в каждом элементе, а не сдвигать местоположение на один байт.В вашем случае:
0x080490a4
- адрес первого элемента массива 0x080490a8
- адрес второго элемента массива 0x080490a5
, 0x080490a6
и 0x080490a7
- все адреса не выровнены (т.е. они не кратны размеру слова), каждый из которых указывает на 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 ...
Т.е. значение, хранящееся в 0x080490a5
, имеет:
в качестве трех младших байтов, трех старших байтов первого элемента массива
в качестве самого старшего байта первого байта (т. Е. Самого младшего байта) второго элемента массива
И так как x86 имеет младший порядок байтов, и GDB re-упорядочивает байты, которые он показывает, так что MSB отображается первым, вы получаете:
0x80490a5: 00010100 00000000 00000000 00000000