为什么malloc总是返回0x的地址??????? 8

Mou*_*ian 2 c heap malloc

我写了一个简单的代码: -

 void * aa = malloc(10 * sizeof(char));
 printf("%X\n", aa);
 free(aa);
Run Code Online (Sandbox Code Playgroud)

它始终打印??????? 8,我想问的是:malloc总是返回一个4*n的地址吗?为什么这里的最后一个地址总是8?为什么不4或C?我的环境:ubuntu 10.04(32位)gcc版本4.4.3

Rub*_*ink 8

原因通常是根据对齐问题; 约束是满足处理器要求,协助缓存优化策略或其他原因.

作为满足系统(操作系统,语言规范,处理器)对齐要求的核心目的的一部分,否则将导致错误(具有取决于系统的不同影响)或低效行为(必须进行额外的内存读取以获得相同的数据)因为它在运行时横跨内存块边界),将应用最小对齐要求.

但是,您可以凭经验发现它们的对齐程度甚至高于前面约束严格要求的程度.例如,特定的分配器实现可能会因为以下原因而增加它:

  • 添加内存溢出障碍和/或其他完整性检查/验证机制
  • 允许指针更有效地存储(例如,如果你知道底部的4位是零,你可以在你坚持它们时以某种方式打包它们
  • 简化或提高地址计算的效率
  • 减少碎片化和/或其他原因,这些原因似乎不能为个人的分配提供好处,但在更大的分配范围内满足某些目标


NPE*_*NPE 6

有几个问题在起作用:

  1. malloc()需要返回一个对齐的地址,以便它可以用于任何数据类型.更正式(C99 7.20.3):

    如果分配成功,则返回的指针被适当地对齐,以便可以将其指定给指向任何类型对象的指针,然后用于在分配的空间中访问此类对象或此类对象的数组(直到空间被显式释放) .

  2. 分配器的实现者可以选择使用大于对齐要求所暗示的最小块的内存块.例如,出于效率原因(涉及权衡取舍),可以这样做.