struct
{
uint32_t i;
uint32_t i2;
}s;
printf("%p %p", &s.i, &s.i2);
Run Code Online (Sandbox Code Playgroud)
如果以上示例打印:
0 4
这意味着进入结构的最顶层成员位于较小的存储器地址,并且随后的元素以递增的顺序存储在连续的地址处.
如果平台字节顺序被反转怎么办?这种模式会改变吗?这是在某些C标准的规范中提到的吗?
C struct不是数字字(它不是CPU处理的实体),所以答案是否定的,字节顺序不会影响结构成员如何存储到内存中
影响结构成员如何存储到内存中的是数据结构对齐,它可以在成员之间添加一些填充以对齐成员地址,使其等于字大小的某个倍数
字节顺序不是决定struct成员抵消过程中的一个因素.初始成员将始终在零偏移处分配; 其余成员将按照它们在struct声明中出现的顺序以较高的抵消额进行分配.
与系统无关的程序编码方式如下:
struct {
uint32_t i;
uint32_t i2;
}s;
intptr_t p = (intptr_t)&s;
intptr_t pi = (intptr_t)&s.i;
intptr_t pi2 = (intptr_t)&s.i2;
printf("%tu %tu\n", pi-p, pi2-p);
Run Code Online (Sandbox Code Playgroud)
演示1. intptr_t让你把指针看作是整数; %tuformat specifier将ptrdiff_t值打印为无符号数.
你也可以这样做:
struct S {
uint32_t i;
uint32_t i2;
};
printf("%tu %tu\n", offsetof(struct S, i), offsetof(struct S, i2));
Run Code Online (Sandbox Code Playgroud)
演示2.