struct中的字节顺序

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 intlong4,以及short2.

假设没有填充.

那么怎样的布局10 bytesstruct呢?

它取决于字节顺序吗?

会是这样的:

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)

我想手动用数据填充这个数组,然后memcpystruct.

我应该做[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]在一个大端工作器上工作?

bas*_*hrc 3

它取决于字节顺序吗?

是的,它确实取决于机器的字节顺序。所以你的逻辑将根据机器的字节顺序而改变。

由于结构填充,没有可移植的方法*来做到这一点尽管不同的编译器确实提供了禁用结构填充的自定义方法。检查强制 C++ 结构不进行字节对齐

  • 您可以添加static_assert(需要 C11 支持) 只是为了确保您的代码不会编译,除非您的结构紧密包装。您不会有可移植的代码,但您仍然可以确定,如果您的代码可以编译,它将正常运行。

    static_assert(sizeof(container) == sizeof(int) + sizeof(short) + sizeof(long));
    
    Run Code Online (Sandbox Code Playgroud)

  • 对于在纯 C 问题中链接到纯 C++ 问题,我有不同的看法。这至少是一个警告标志。 (2认同)