2015-11-11 22 views
0
#include<stdio.h> 

struct std 
    { 
    char c; 
    char e; 
}; 

void main() 
    { 
    struct std p,q; 
    int start,last; 
    last= &q; 
    start= &p; 
    printf("Size:%u %u Address_Diff:%d \n",&p, &q,(last-start)); 
} 

我正在学习结构对齐和填充,而我们执行上面的程序,每次显示16个字节的两个结构变量之间的时差。我不明白为什么差异是16字节,但我期待的差异是2个字节。为什么在64位操作系统中,结构变量之间的差异始终是16字节?

一些例子:

4077309424 4077309440 DIFF:16

3600238672 3600238688 DIFF:16

3272011008 3272011024 DIFF:16

+1

由于填充结构的大小是16个字节(每个单字节填充了额外的7个字节)。 –

+1

@EugeneSh。这里显示的结构几乎都没有填充任何形式的形状,其大小为2,至少在所有常见平台上。 – nos

回答

0

一般来说编译器可填充字节,以保持每个结构变量开始定位为单词或双字对齐。我猜测对齐位置的选择可能是架构和编译器的依赖。

看来你的编译器为每个结构变量保持16字节对齐。有时编译器可能会将字节填充到结构的元素以保持字或双字对齐。您可以检查字节填充发生的位置,我的意思是字节或填充元素级别或结构级别。

打印每个元素地址(如下所示)并查看它们之间的区别。

printf("Size:%u %u Address_Diff:%d \n",&p.c, &p.e); 

如果差异仅仅是一个字节,则意味着字节在结构级别即结构的末尾被填充。

相关问题