【发布时间】:2016-02-01 23:32:07
【问题描述】:
我对@987654321@ 中字节的排序方式有点困惑。
假设我有以下结构:
struct container {
int myint;
short myshort;
long mylong;
};
现在,我想初始化一个struct container 类型的变量,如下所示,除了我想使用数组来完成。
struct container container1 = {.myint = 0x12345678,
.myshort = 0xABCD,
.mylong = 0x12345678};
假设sizeofint和long是4,short是2。
假设没有填充。
那么struct 的10 bytes 的布局会怎样呢?
是否取决于字节序?
会是这样的:
0x12345678 ABCD 12345678
或喜欢:
0x78563412 CDAB 78563412
我想做的是:我有以下 char 数组:
char buffer[10] = {0};
我想用数据手动填充这个数组,然后将memcpy 填充到struct。
我应该这样做[1]:
buffer[0] = 0x12345678 & 0xFF;
buffer[1] = 0x12345678 >> 8 & 0xFF;
buffer[2] = 0x12345678 >> 16 & 0xFF;
buffer[3] = 0x12345678 >> 24 & 0xFF;
...
buffer[9] = 0x12345678 >> 24 & 0xFF;
或者应该是[2]:
buffer[0] = 0x12345678 >> 24 & 0xFF;
buffer[1] = 0x12345678 >> 16 & 0xFF;
buffer[2] = 0x12345678 >> 8 & 0xFF;
buffer[3] = 0x12345678 & 0xFF;
...
buffer[9] = 0x12345678 & 0xFF;
在我做我的memcpy 之前:
memcpy(&container1, buffer, sizeof(container1);
而且,如果我正在写入一个数组并复制到 struct,它是否可以跨系统移植,尤其是在字节序方面?
编辑: [1] 是否在小端机器上工作,而 [2] 在大端机器上工作?
【问题讨论】:
-
不,它不是便携式的。是的,这取决于字节序。并且关于填充和类型大小的假设也会导致可移植性问题。
-
为了强调没有可移植的方式,这意味着在同一个操作系统上从编译器到编译器没有可移植的方式,更不用说从操作系统到操作系统的可移植性了。
-
当然取决于字节序!在您的“没有填充”假设之后,问题不再与结构类型有关。它只是关于在内存中表示整数。
-
是否可以保证
myint和myshort放在mylong之前?由于对齐问题,似乎订购它们mylong、myint、myshort可能更有效 - 如果不允许实现进行此优化,那将是很遗憾的。
标签: c arrays pointers memory struct