2011-12-20 338 views
6

我碰到下面的代码:malloc会保证内存对齐吗?

int main() 
{ 
    char *A=(char *)malloc(20); 
    char *B=(char *)malloc(10); 
    char *C=(char *)malloc(10); 
    printf("\n%d",A); 
    printf("\t%d",B); 
    printf("\t%d\n",C); 
    return 0; 
} 
//output-- 152928264  152928288 152928304 

我想知道如何分配和填充由malloc()完成。看看输出,我可以看到起始地址是8的倍数。是否有其他规则?

+2

无论您通过研究计算机上的malloc做什么“规则”......只要您移动到另一台计算机,或更改编译器选项,或者月亮的相位发生变化,就应该没有学习。 ..,... :) – pmg 2011-12-20 13:03:28

+3

要打印一个指针,你应该使用'“%p”'并将其转换为void *':'printf(“%p”,(void *)A);' – pmg 2011-12-20 13:04:22

+0

i dont真正理解你的问题。 – 2011-12-20 13:05:01

回答

8

Accdording到this documentation page

通过的malloc或realloc在GNU系统返回的块的地址总是八(或16在64位系统)的倍数。

一般而言,malloc的实现是系统特定的。他们都为自己的簿记保留一些内存(例如分配块的实际长度),以便在您拨打free时能够正确释放该内存。如果您需要对齐到特定边界,请使用其他功能,例如posix_memalign

4

唯一的标准规则是由malloc返回的地址将被适当对齐以存储任何类型的变量。究竟是什么意思是平台特定的(因为对齐需求因平台而异)。

0

对于32位Linux系统:
当malloc()分配内存时,它将以8的倍数(8的填充)分配内存并为簿记分配额外的8个字节。

例如:

的malloc(10)和的malloc(12)将(填充+ 8 字节记账后16个字节)分配24个字节的存储器。

malloc()做填充因为返回的地址将是8的倍数,因此对于任何类型的指针都是有效的。当我们调用免费功能时,使用8个字节的簿记。簿记字节存储分配的内存的长度。