我写了一个简单的代码: -
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
原因通常是根据对齐问题; 约束是满足处理器要求,协助缓存优化策略或其他原因.
作为满足系统(操作系统,语言规范,处理器)对齐要求的核心目的的一部分,否则将导致错误(具有取决于系统的不同影响)或低效行为(必须进行额外的内存读取以获得相同的数据)因为它在运行时横跨内存块边界),将应用最小对齐要求.
但是,您可以凭经验发现它们的对齐程度甚至高于前面约束严格要求的程度.例如,特定的分配器实现可能会因为以下原因而增加它:
有几个问题在起作用:
malloc()需要返回一个对齐的地址,以便它可以用于任何数据类型.更正式(C99 7.20.3):
如果分配成功,则返回的指针被适当地对齐,以便可以将其指定给指向任何类型对象的指针,然后用于在分配的空间中访问此类对象或此类对象的数组(直到空间被显式释放) .
分配器的实现者可以选择使用大于对齐要求所暗示的最小块的内存块.例如,出于效率原因(涉及权衡取舍),可以这样做.