c - 如何确定未命名结构的大小?

标签 c

我正在寻找一种方法来确定未命名结构的大小,因为我想显式计算填充。

我有一组具有通用总体布局的结构

struct Packet {
  uint8_t AllocatorDebugInfo[ALLOC_SIZE /* constant across all structs */ ];
  /* OPTIONAL */ uint8_t Padding[       /* Needs to be determined */      ];
  uint8_t Header[HEADER_SIZE            /* dependent on  packet type */   ];
  uint8_t Payload[PAYLOAD_SIZE          /* constant across all structs*/  ];
}; 

我有以下要求:

  • 我写了一个特殊用途的分配器,在数据包前面有调试信息。
  • 我想要可交换的 header 类型,同时保持所有数据包类型布局的负载兼容。

我正在尝试计算 header 大小,如下面的代码所示:

typedef union {
  struct { /* opaque */ } SmallHeader;
  struct { /* opaque */ } MedHeader;
  struct { /* opaque */ } LargeHeader;
} HeaderSizes;

HeaderSizes *p;
enum { SMALL_PADDING = sizeof(HeaderSizes) - sizeof(p->SmallHeader)) };

不幸的是内存紧张,我正在寻找避免全局指针的方法。

编辑:

显然,尝试像这样计算一个可选的填充是一个非常糟糕的主意。这仅在您意识到最大的结构将具有比预期更多的填充(零)这一事实时才有效。

enum { LARGE_PADDING = sizeof (HeaderSizes) - sizeof ((HeaderSizes*)0->LargeHeader) };
struct LargePacket {
  uint8_t AllocDebug[ALLOC_SIZE];
  uint8_t Padding[ LARGE_PADDING ]; /* will evaluate to 0 -- struct size 1 */
  uint8_t Payload[ PAYLOAD_SIZE ];  /* off by 1 */
};

最佳答案

sizeof 运算符不需要有效实例即可返回大小。它只需要一个计算结果为正确类型的表达式。虽然有点 hack,但您可以将 NULL 转换为 HeaderSizes*

sizeof(((HeaderSizes*)NULL)->SmallHeader)

由于这不是取消引用空指针,而是一种语法构造,因此上述内容完全有效并给出了正确的结果。例如下面的例子。

http://ideone.com/QKTOdP

关于c - 如何确定未命名结构的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20679070/

相关文章:

c - C中GUID的简单生成

c - C 中小于 1 的舍入值?

c++ - 检查一个整数是否是 O(1) 空间中的回文(错误答案)

c - 使用 C 在 Linux 中使用 USB 串行电缆从传感器串行读取

objective-c - 是否可以在 Objective-C 中将一个函数嵌套在另一个函数中

c - 是什么意思!!在 C 中——为什么需要它?

c++ - 下面的C代码有什么问题!

c++ - 如何使用 Doxygen 注释生成的代码

c - 如何将 48 位 RRRRGGGGBBBB 颜色转换为 24 位 RRGGBB 颜色格式

c - 在 C 中发送的推荐 block 大小?