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

时间:2012-11-16 13:06:09

标签: 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
    uint8 crc_l;        // CRC value LSB
}CMD_TYPE;
我可以这样写吗?

typedef struct { uint8 len, cmd, data_length, data[12], crc_h, crc_l; }CMD_TYPE;

如果有可能那么为什么人们不会将类似成员分组?! 内存分配方案会发生什么,除了内存丢失之外,还有任何隐藏的副作用来改变成员的顺序(如果我是正确的话,由于填充!)。

如果这看起来太傻了,请原谅我。

4 个答案:

答案 0 :(得分:3)

你可以写两种方式,但是你会注意到第一种方式比第二种方式更具可读性,并且由于数据结构在 C 中非常重要,实际上最好定义它们以更冗长的方式。

您编写struct声明的方式(每个字段一行,或同一行中相同类型的每个字段)都不会影响运行时发生的事情。

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

填充,或sizeof的{​​{1}}或其对齐仅取决于字段及其顺序(以及目标处理器和ABI),而不是您编写它们的方式。

答案 1 :(得分:1)

  

为什么人们不会将类似的成员分组?!

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

int width, height;
char *begin, *end;

或者当您需要在for循环中声明多个变量时。

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

  

内存分配方案会发生什么,也有任何隐藏的副作用,改变成员的顺序,除了内存丢失(由于填充,如果我是对的!)。

我所知道的一切。

答案 2 :(得分:0)

您的代码唯一可行的是您具有相同的类型(无符号字节)。

最常见的情况并非如此+在每个成员的上方或右侧发表评论总是很好。

答案 3 :(得分:0)

在这里,您可以看到标准中有关填充和内存分配的内容。 ![这直接来自ISO C标准DOC] [1] [1]:http://i.stack.imgur.com/UzgDY.png