C结构:成员顺序和内存分配

C结构:成员顺序和内存分配,c,memory,structure,member,C,Memory,Structure,Member,而不是写这样的结构 typedef struct { uint8 len; // Command length (cmd ... crc) uint8 cmd; // Command code uint8 data_length; // Data length uint8 data[12]; // Data: max 12 Byte uint8 crc_h; // CRC value MSB

而不是写这样的结构

typedef struct {
    uint8 len;          // Command length (cmd ... crc)
    uint8 cmd;          // Command code
    uint8 data_length;  // Data length
    uint8 data[12];     // Data: max 12 Byte
    uint8 crc_h;        // CRC value MSB
    uint8 crc_l;        // CRC value LSB
}CMD_TYPE;
我可以这样写吗

typedef struct { uint8 len, cmd, data_length, data[12], crc_h, crc_l; }CMD_TYPE;
如果可能的话,为什么人们不把相似的成员分组呢?! 内存分配方案会发生什么情况?除了内存丢失之外,更改成员顺序是否还有任何隐藏的副作用(如果我是对的,则是由于填充!)


如果这看起来很愚蠢,请原谅。

您可以用两种方式编写,但是您会注意到第一种方式比第二种方式更可读,而且由于数据结构在C语言中非常重要,因此实际上最好用更详细的方式定义它们

编写
struct
声明的方式(每个字段一行,或者同一行上相同类型的每个字段)不会影响运行时发生的情况

struct
中成员字段的顺序非常重要


填充,或结构的
大小,或其对齐方式仅取决于字段及其顺序(以及目标处理器和ABI),而不取决于写入方式。

您可以两种方式写入,但您会注意到第一种方式比第二种方式更具可读性,由于数据结构在C语言中非常重要,所以在实践中最好以更详细的方式定义它们

编写
struct
声明的方式(每个字段一行,或者同一行上相同类型的每个字段)不会影响运行时发生的情况

struct
中成员字段的顺序非常重要


填充,或结构的
大小,或其对齐方式仅取决于字段及其顺序(以及目标处理器和ABI),而不取决于您编写它们的方式。

您的代码唯一有效的地方是您具有相同的类型(无符号字节)


最常见的情况并非如此+在每个成员的上方或右侧都有注释总是很好的。

您的代码唯一有效的地方是您具有相同的类型(无符号字节)

这不是最常见的情况+在每个成员的上方或右侧都有评论总是很好的

为什么人们不能将相似的成员分组

结构是一组相似的成员。每行声明多个变量只有在它们密切相关时才有效,例如:

int width, height;
char *begin, *end;
或者当您需要在
for
循环中声明多个变量时

请注意,单独的行更容易阅读。人类阅读短小的、对齐的列(二维)而不是长线(一维)

内存分配方案会发生什么情况?除了内存丢失之外,更改成员顺序是否还有任何隐藏的副作用(如果我是对的,则是由于填充!)

我什么都不知道

为什么人们不能将相似的成员分组

结构是一组相似的成员。每行声明多个变量只有在它们密切相关时才有效,例如:

int width, height;
char *begin, *end;
或者当您需要在
for
循环中声明多个变量时

请注意,单独的行更容易阅读。人类阅读短小的、对齐的列(二维)而不是长线(一维)

内存分配方案会发生什么情况?除了内存丢失之外,更改成员顺序是否还有任何隐藏的副作用(如果我是对的,则是由于填充!)


我什么都不知道。

在这里,您可以看到标准对填充和内存分配的规定。
![这直接来自ISO C标准文档][1][1]:

在这里,您可以看到该标准对填充和内存分配的说明。
![这直接来自ISO C标准文档][1][1]:

那么您会将注释放在哪里?使用
typedef struct{uint8 x[17];}C。为什么人们不这样做?你好,波,你不帮忙,那是什么态度?!那么你会把注释放在哪里呢?使用
typedef struct{uint8x[17];}c。为什么人们不这样做?你好,波,你不帮忙,那是什么态度?!我现在明白了,谢谢你的帮助。但我对你最后的评论非常怀疑,因为以下两种结构的大小差别很大
结构1:Br/>结构测试{Br/> char a;
int b;
char c;
} BR/>结构Test1{{Br/> char A,C;
int B;
结构1:Br/>结构测试{Br/> char a;
int b;
char c;
} BR/>结构Test1{{Br/> char A,C;
int B;