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;