struct
{
uint32_t i;
uint32_t i2;
}s;
printf("%p %p", &s.i, &s.i2);
如果上述打印的例子:字节序是否影响结构构件是如何存储到存储器
这意味着,最上面的部件到该结构位于较小的存储器地址以及随后的元素以递增顺序存储在连续的地址处。
如果平台排列顺序颠倒了怎么办?这种模式会改变吗? 这是在某个C标准的规范中某处提到的吗?
struct
{
uint32_t i;
uint32_t i2;
}s;
printf("%p %p", &s.i, &s.i2);
如果上述打印的例子:字节序是否影响结构构件是如何存储到存储器
这意味着,最上面的部件到该结构位于较小的存储器地址以及随后的元素以递增顺序存储在连续的地址处。
如果平台排列顺序颠倒了怎么办?这种模式会改变吗? 这是在某个C标准的规范中某处提到的吗?
字节顺序的某个倍数并不是确定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));
Endianness refers to the order of the bytes comprising a digital word in computer memory
Çstruct
不是一个数字字(它不是与CPU处理的实体),因此答案是否定的,字节序不影响结构构件是如何存储到存储器
什么影响结构构件是如何存储到存储器是Data structure alignment,这可能会增加构件之间一些填充到对准构件地址以使其等于字大小
注意:术语“数字字”在C中没有相关性。C中的字节顺序以C的存储器模型中连续的“字符”大小的单元格存储整数类型的方式表示。 – 2016-08-17 09:10:01
@Rhymoid你是对的,这增加了理解endianness没有连接到C.“数字词”是维基百科中的_endianness_文章中使用的术语,我刚刚引用 – mvidelgauz
字节顺序是指处理器自然类型内的字节顺序:integers
和floats
。不管字节顺序如何,struct
中的顶部元素总是会在内存中排在第一位。由于通常结构体被填充(字节对齐)依赖于编译器等,因此您必须考虑这些差距。
结构成员的布局是依赖于实现的,因此它可以在编译器的品牌,选择的优化模式和目标体系结构。但是,通常,endiannes是多字节类型中的字节顺序(如int32
),因此它不应该影响多字节数据块的顺序。
字节顺序不会影响成员的顺序。
从N1570 6.7.2.1结构和联合指示符:
- 如在6.2节中讨论。在图5中,结构是由组成的类型,其存储按照有序序列分配,并且联合是由存储重叠的成员的序列 组成的类型。
虽然在成员之间和结构的结尾可能会有填充字节。
将错误类型传递给可变参数函数的未定义行为。 – EOF
他/她意味着您的示例将不起作用,因此不会显示任何内容。但是......尽管你的例子,你的问题仍然存在。 – noelicus
Endianess不应该有效果。结构的第一个元素的偏移量应始终为零。每个下一个元素的偏移量应该大于其前一个元素的偏移量。 – PSkocik