struct
{
uint32_t i;
uint32_t i2;
}s;
printf("%p %p", &s.i, &s.i2);
如果上面的示例打印:
这意味着结构中最顶层的成员位于较小的存储器地址,并且随后的元素以递增的顺序存储在连续的地址中。
如果平台字节序颠倒了怎么办?这种模式会改变吗?
在某些C标准的规范中是否提到了这一点?
最佳答案
在确定struct
成员的偏移量的过程中,字节顺序不是一个因素。初始成员将始终分配在偏移量0处;其余成员将按照它们在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);
Demo 1.
intptr_t
允许您将指针视为整数。 %tu
格式说明符将ptrdiff_t
值打印为无符号数字。您也可以这样:
struct S {
uint32_t i;
uint32_t i2;
};
printf("%tu %tu\n", offsetof(struct S, i), offsetof(struct S, i2));
Demo 2。
关于c - 字节顺序是否会影响结构成员存储到内存中的方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38992147/