用 3 个字节填充 C 中的结构
Padding of a struct in C with 3 bytes
假设我在 C 中有一个这样的结构和变量:
typedef struct {
uint8_t x;
uint8_t y;
uint8_t z;
}my_type;
my_type a;
my_type a10[10];
C99 可以肯定
sizeof(a) == 3
? (而不是 4 或 8)
sizeof(a10) == 30
? (而不是 40 或 80)
如评论中所述,可以默认添加填充。
为避免这种情况,您可以使用 __attribute__((packed))
作为您的结构。
这将告诉编译器尽可能紧密地打包您的结构。
看起来像这样:
typedef struct {
uint8_t x;
uint8_t y;
uint8_t z;
} __attribute__((packed)) my_type;
With C99 is it certain that sizeof(a) == 3?
This type will be used as color for an RGB888 framebuffer. So it's important to NOT have space between the adjacent RGB values.
typedef struct {
uint8_t x;
uint8_t y;
uint8_t z;
}my_type;
没有。大小可能是 3 或 4(或理论上其他,但不太可能)
2 个解决方案:
放弃可移植性并使用编译器特定代码打包结构。
将struct
改为3uint8_t
的数组,调整代码
我推荐最后一个。
假设我在 C 中有一个这样的结构和变量:
typedef struct {
uint8_t x;
uint8_t y;
uint8_t z;
}my_type;
my_type a;
my_type a10[10];
C99 可以肯定
sizeof(a) == 3
? (而不是 4 或 8)sizeof(a10) == 30
? (而不是 40 或 80)
如评论中所述,可以默认添加填充。
为避免这种情况,您可以使用 __attribute__((packed))
作为您的结构。
这将告诉编译器尽可能紧密地打包您的结构。
看起来像这样:
typedef struct {
uint8_t x;
uint8_t y;
uint8_t z;
} __attribute__((packed)) my_type;
With C99 is it certain that
sizeof(a) == 3?
This type will be used as color for an RGB888 framebuffer. So it's important to NOT have space between the adjacent RGB values.
typedef struct {
uint8_t x;
uint8_t y;
uint8_t z;
}my_type;
没有。大小可能是 3 或 4(或理论上其他,但不太可能)
2 个解决方案:
放弃可移植性并使用编译器特定代码打包结构。
将
struct
改为3uint8_t
的数组,调整代码
我推荐最后一个。