Arj*_*ran 5 c memory arrays struct pointers
关于如何在a中排序字节,我有点困惑struct.
假设我有以下结构:
struct container {
int myint;
short myshort;
long mylong;
};
Run Code Online (Sandbox Code Playgroud)
现在,我想初始化一个类型的变量,struct container就像下面这样,除了我想用数组做.
struct container container1 = {.myint = 0x12345678,
.myshort = 0xABCD,
.mylong = 0x12345678};
Run Code Online (Sandbox Code Playgroud)
假设sizeof int和long是4,以及short是2.
假设没有填充.
那么怎样的布局10 bytes的struct呢?
它取决于字节顺序吗?
会是这样的:
0x12345678 ABCD 12345678
Run Code Online (Sandbox Code Playgroud)
或者喜欢:
0x78563412 CDAB 78563412
Run Code Online (Sandbox Code Playgroud)
我想要做的是:我有以下char数组:
char buffer[10] = {0};
Run Code Online (Sandbox Code Playgroud)
我想手动用数据填充这个数组,然后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;
Run Code Online (Sandbox Code Playgroud)
或应该是[2]:
buffer[0] = 0x12345678 >> 24 & 0xFF;
buffer[1] = 0x12345678 >> 16 & 0xFF;
buffer[2] = 0x12345678 >> 8 & 0xFF;
buffer[3] = 0x12345678 & 0xFF;
...
buffer[9] = 0x12345678 & 0xFF;
Run Code Online (Sandbox Code Playgroud)
在我这样做之前memcpy:
memcpy(&container1, buffer, sizeof(container1);
Run Code Online (Sandbox Code Playgroud)
而且,如果我正在写一个数组并复制到struct它,它是否可以跨系统移植,特别是在字节序方面?
编辑:[1]是否在一个小端机器上工作,[2]在一个大端工作器上工作?
它取决于字节顺序吗?
是的,它确实取决于机器的字节顺序。所以你的逻辑将根据机器的字节顺序而改变。
由于结构填充,没有可移植的方法*来做到这一点。尽管不同的编译器确实提供了禁用结构填充的自定义方法。检查强制 C++ 结构不进行字节对齐。
您可以添加static_assert(需要 C11 支持) 只是为了确保您的代码不会编译,除非您的结构紧密包装。您不会有可移植的代码,但您仍然可以确定,如果您的代码可以编译,它将正常运行。
static_assert(sizeof(container) == sizeof(int) + sizeof(short) + sizeof(long));
Run Code Online (Sandbox Code Playgroud)