struct
{
uint32_t i;
uint32_t i2;
}s;
printf("%p %p", &s.i, &s.i2);
如果以上示例打印:
0 4
这意味着结构中最顶层的成员位于较小的内存地址,后续元素按递增顺序存储在连续的地址中。
如果平台字节顺序被反转怎么办?这种模式会改变吗? 这是在某些C标准的规范中提到的吗?
答案 0 :(得分:5)
Endianness refers to the order of the bytes comprising a digital word in computer memory
C struct
不是数字字(它不是CPU处理的实体),所以答案是否定的,字节顺序不会影响结构成员如何存储到存储器
影响结构成员存储到内存中的方式是Data structure alignment,它可以在成员之间添加一些填充以对齐成员地址,使其等于字大小的某个倍数
答案 1 :(得分:5)
字节顺序不是决定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);
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));
答案 2 :(得分:2)
字节顺序不会影响成员的顺序。
从N1570开始6.7.2.1结构和联合说明符:
- 如6.2.5中所讨论的,结构是由成员序列组成的类型,其成员 存储按有序顺序分配,而union是由序列组成的类型 存储重叠的成员。
醇>
虽然成员之间和结构末端可能有填充字节。
答案 3 :(得分:1)
字节顺序是指处理器的自然类型中的字节顺序:integers
和floats
。无论字节顺序如何,struct
中的顶部元素始终位于内存中。您必须注意间隙,因为通常根据编译器等对结构进行填充(字节对齐)。
答案 4 :(得分:0)
结构成员的布局是依赖于实现的,因此它可以在编译器的品牌,选择的优化模式和目标体系结构之间变化。但是,通常情况下,endiannes本身就是多字节类型中的字节顺序(如int32
),所以它不应该影响多字节数据块的顺序。