#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 个字节。
一些例子:
4077309424 4077309440差异:16
3600238672 3600238688差异:16
3272011008 3272011024差异:16
通常编译器可以填充字节,以保持每个结构变量的起始位置与单词或双单词对齐。我想对齐位置的选择可能取决于架构和编译器。
似乎您的编译器为每个结构变量保持 16 字节对齐。有时编译器可能会将字节填充到结构元素中,以保持单词或双单词对齐。您可以检查字节填充发生的位置,我的意思是字节或在元素级别或结构级别填充。
请打印每个元素地址(如下所示(并查看它们之间的区别。
printf("Size:%u %u Address_Diff:%d n",&p.c, &p.e);
如果差值只有一个字节,则意味着字节在结构级别填充,即在结构的末尾。