c - 为什么 64 位 Ubuntu 中的 8 字节数组 (C) 占用 16 字节?

标签 c 64-bit x86-64 32bit-64bit sizeof

我最近一直在(重新学习)较低级别的 CS Material ,并且我一直在探索缓冲区溢出。我创建了一个基本的 C 程序,它有一个 8 字节数组 char buffer[8];。然后我使用 GDB 来探索和反汇编程序并逐步执行它。我在 64 位版本的 Ubuntu 上,我注意到我的 8 字节 char 数组实际上在内存中以 16 字节表示 - 高阶位全部为 0。

例如而不是 0xDEADBEEF 0x12345678 我可能希望代表 8 字节数组,它实际上类似于 0x00000000 0xDEADBEEF 0x00000000 0x12345678

我进行了一些谷歌搜索,并能够让 GCC 将我的程序编译为 32 位程序(使用 -m32 标志)——结果是正常的预期 8 字节。

我只是在寻找关于为什么 8 字节字符数组在 64 位系统上以 16 字节表示的明确解释。是否因为最小字长/可寻址单元为 16 字节(64 位)而 GDB 只是基于 8 字节字长打印?

希望这是清楚的,但如果需要澄清,请告诉我。

最佳答案

64 位系统旨在将所有内存对齐到 16 字节边界(16 字节堆栈对齐是 System-V ABI 的一部分),对于堆栈分配,有两个部分,首先,堆栈本身需要对齐,其次,任何分配都会尝试保留该对齐方式。

这解释了第一部分为什么 8 字节数组在堆栈上变成 16 字节,为什么它被分成两个 8 字节 qwords,这有点难说,因为你没有提供任何代码(程序集或 C)关于此缓冲区的使用。并尝试使用 mingw64 复制它提供 16 字节对齐,但不是您看到的有趣布局。

当然,由于缺少 ASM 而导致的另一种可能性是 GDB 显示 2xQWORD,即使它实际上是 2xDWORD(换句话说,尝试使用 p/x (char[8])转储内容...)。

关于c - 为什么 64 位 Ubuntu 中的 8 字节数组 (C) 占用 16 字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14452052/

相关文章:

c - 在二进制文件中查找模式/在二进制文件中查找匹配 (C)

c - 为什么标准提到分配存储中的分配顺序

linux - 64 位 Linux 机器中可能的最大共享内存大小

assembly - 当我们有一个红色区域时,为什么我们需要堆栈分配?

c - C 中的列表和字符串问题

C : Return Type Defaults to Int

assembly - mov 立即数到 64 位寄存器的十六进制机器代码没有 REX.W 前缀?

汇编中的C函数调用问题

android - 解包 64 位设备的 'Non-Standard' Boot.img 问题

c# - Windows 服务 - 迁移到 64 位。 '64-bit benefits'的实现步骤