我写了一个简单的代码:-
void * aa = malloc(10 * sizeof(char));
printf("%Xn", aa);
free(aa);
它总是打印???????8.我想问的是:malloc总是返回4*n地址吗?为什么这里地址的最后一个数字总是8?为什么不是4或C?我的环境:ubuntu 10.04(32位)gcc 4.4.3版
原因通常源于对齐问题;约束是为了满足处理器需求、辅助缓存优化策略或其他原因。
作为满足系统(操作系统、语言规范、处理器)对齐要求的核心目的的一部分,否则会在运行时导致故障(根据系统的不同影响不同)或低效行为(必须进行额外的内存读取以获得跨越内存块边界的相同数据),最低对齐要求将适用。
然而,你可能会根据经验发现,它们的对齐程度甚至高于前面约束严格要求的程度。例如,一个特定的分配器实现可能会因为以下原因而增加它:
- 添加内存溢出屏障和/或其他完整性检查/验证机制
- 允许更有效地存储指针(例如,如果您知道底部的4位为零,则可以在持久化指针时以某种方式对其进行打包
- 简化或提高地址计算的效率
- 减少碎片化和/或其他原因,这些原因似乎不会为个人所有位置带来好处,但会在更大的分配范围内满足某些目标
有几个问题在起作用:
-
malloc()
需要返回一个对齐的地址,以便它可以用于任何数据类型。更正式(C99 7.20.3):如果分配成功,则返回的指针被适当地对齐,以便它可以被分配给指向任何类型对象的指针,然后用于访问所分配的空间中的这样的对象或这样的对象的数组(直到空间被明确地解除分配)。
-
分配器的实现者可以选择使用比对齐要求所暗示的最小块大的内存块。例如,出于效率的原因(需要权衡取舍),可以这样做。
原因是对齐,8字节对齐被认为是最有效的。
您可以从这里开始:http://www.delorie.com/gnu/docs/glibc/libc_31.html