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

时间:2012-02-06 08:26:43

标签: c malloc heap

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

 void * aa = malloc(10 * sizeof(char));
 printf("%X\n", aa);
 free(aa);

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

3 个答案:

答案 0 :(得分:8)

原因通常源于alignment个问题;约束是为了满足处理器要求,协助cache optimization strategies或其他原因。

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

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

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

答案 1 :(得分:6)

有几个问题在起作用:

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

      

    如果分配成功,则返回指针,以便将其分配给指向任何类型对象的指针,然后用于在分配的空间中访问此类对象或此类对象的数组(直到空格为明确解除分配)。

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

答案 2 :(得分:2)

原因是对齐,8字节对齐被认为是最有效的。

你可以从这里开始:http://www.delorie.com/gnu/docs/glibc/libc_31.html