【问题标题】:Inconsistent byte order while examining memory of an integer and a char array检查整数和字符数组的内存时字节顺序不一致
【发布时间】:2019-05-02 12:54:00
【问题描述】:

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 数组数据有区别? 看起来值变量存储为大端,我错过了什么吗?

【问题讨论】:

  • 关于明确给出数组大小的两个附注。 1) char 缓冲区通常用作以空字符结尾的字符串,并且您没有为文字字符串中隐含的终止符留出空间。 2) 编译器使用您指定的“执行字符集”发出文字字符,并且每个“字符”可能并不总是使用一个 char。因此,省略文字字符串的显式数组大小。您会看到调试器还显示空终止符,以及您选择的字符编码中的字节。

标签: c gdb endianness


【解决方案1】:

变量buffer是四个字节

+------+------+------+------+ | 0x31 | 0x32 | 0x33 | 0x34 | +------+------+------+------+ ^ ^ | | 低地址 高地址

变量value是四个字节

+------+------+------+------+ | 0x34 | 0x33 | 0x32 | 0x31 | +------+------+------+------+ ^ ^ | | 低地址 高地址

x 命令以本机字节顺序(在您的情况下为小端序)显示,从而导致您获得输出。

【讨论】:

  • 哇,奇怪...这是有原因的吗?
  • @sergeyrar 是的,这是有原因的:buffer 是一个数组,第一个元素总是位于内存中的最低地址。对于其他值,没有这样的固定规则(否则我们不会遇到所有字节顺序问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 2013-08-19
  • 2010-11-26
  • 2016-10-21
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
相关资源
最近更新 更多