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/

10-10 14:06