Несовместимый порядок байтов при проверке памяти целого и массива символов - PullRequest
0 голосов
/ 30 ноября 2018

На машине little endian я пытаюсь исследовать память следующих переменных, используя GDB.

int main()
{
      char buffer[4] = "1234";
      int value = 0x31323334;
          //ascii - "1 2 3 4"

      retun 0;
}

То, что я ожидал увидеть, было:

Для переменной буфера - 0x34333231 Для переменной значения - 0x34333231

Однако вывод проверки GDB:

(gdb) show endian
The target endianness is set automatically (currently little endian)

(gdb) x/w &value 
0x7fffffffe440: 0x31323334
(gdb) x/w buffer
0x7fffffffe444: 0x34333231

Почему существует разница в хранении данных массива int и char в памяти?Похоже, переменная значения хранится как big endian, я что-то упустил?

1 Ответ

0 голосов
/ 30 ноября 2018

Переменная buffer - это четыре байта

+------+------+------+------+
| 0x31 | 0x32 | 0x33 | 0x34 |
+------+------+------+------+
^                           ^
|                           |
Low address                 High address

Переменная value - это четыре байта

+------+------+------+------+
| 0x34 | 0x33 | 0x32 | 0x31 |
+------+------+------+------+
^                           ^
|                           |
Low address                 High address

И команда x отображается в собственном байтеorder (little endian в вашем случае), что приводит к выводу, который вы получите.

...