我的 64 位机器每个内存位置只能存储 4 个字节

My 64 bit machine can only store 4 bytes each memory location

我的电脑是 64 位mac。

内存中这些位置之一存储了多少字节的信息?

当我在 gdb 中尝试某些东西时

x /2x first
0x7ffff661c020: 0xf661b020      0x00007fff 

我的密码是

#define PUT(p, val) (*((size_t *)(p)) = (val))
PUT(first, (size_t)some pointers);

我用gcc -g编译

0x7ffff661c020 中似乎只有4 个字节存储。 0x00007fff存储在 0x7ffff661c024。为什么它不能在 0x7ffff661c020 中存储 0x00007ffff661b020。

谢谢

每个内存位置只能存储八位,因为内存是字节寻址的。 64 位机器不会在每个内存位置都给你 64 位,它只是意味着它可以自然地一次处理 64 位。

例如,寄存器是 64 位宽(除非你有意操作子寄存器,如 axeax 而不是 64 位 rax),你可以加载一条指令从内存中提取那么多位。

您可以看到它是字节可寻址的,因为您的两个地址之间相差四:

0x7ffff661c020: 0xf661b020
0x7ffff661c024: 0x00007fff
              \____________/ four-byte
                           \ difference

并且,如果您使用基于字节的输出,您会看到更多 "naturally",例如:

(gdb) x/8xb first
0x7ffff661c020: 0x20 0xb0 0x61 0xf6 0xff 0x7f 0x00 0x00

所以0x7ffff661c020处的64位值实际上是0x00007ffff661b020,你只需要将gdb命令调整为将其作为完整的 64 位值输出,例如:

x/1xg first

其中1xg表示一个值,十六进制格式,巨字(八个字节)。 x 命令的详细信息可以在 here 中找到,你的问题的重要部分是单位大小的描述(我的粗体):

  • b = 字节。
  • h = 半字(两个字节)。
  • w = 字(四个字节)。 这是初始默认值。
  • g = 巨字(八个字节)。

It seems that only 4 bytes store in 0x7ffff661c020

不:您已要求 GDB 为您提供存储在位置 0x7ffff661c020 的 4 个字节,所以这正是它给您的。试试这个:

(gdb) x/gx 0x7ffff661c020