通过将其嵌套在联合中来为结构生成填充字节

时间:2015-09-20 10:29:02

标签: c struct

我正在通过this question来重申我对结构填充的理解。我现在有一个疑问。当我做这样的事情时:

floorEntry

输出:

#include <stdio.h>

#define ALIGNTHIS 16 //16,Not necessarily

union myunion
{
  struct mystruct
  {
    char a;
    int b;
  } myst;
  char DS4Alignment[ALIGNTHIS];
};

//Main Routine
int main(void)
{
  union myunion WannaPad;

  printf("Union's size: %d\n\
       Struct's size: %d\n", sizeof(WannaPad),
      sizeof(WannaPad.myst));

  return 0;
}

我不应该期望结构被填充8个字节吗?如果我明确地将八个字节填充到结构中,那么将它嵌套在这样的联合中的整个目的是无效的。

我觉得声明一个包含结构和结构大小的字符数组的联合应该是但不是,为一个更简洁的代码让路。

是否有解决方法让它按照我的意愿工作?

3 个答案:

答案 0 :(得分:2)

从逻辑上思考。

想象一下,我的联盟中有一些基本类型:

union my_union{
    int i;
    long l;
    double d;
    float f;
};
你会期待sizeof(int) == sizeof(double)吗?

内部类型将始终是它们的大小,但联合将始终足够大以容纳其任何内部类型。

答案 1 :(得分:1)

默认struct已填充,因此int b字段在sizeof(int)边界上对齐。有几种解决方法:

  • 在需要时明确使用填充程序:char a; char _a[sizeof(int)-1]; int b;
  • 使用编译器相关的pragma在字节边界上打包struct
  • 使用命令行开关等。

答案 2 :(得分:1)

  

我不应该期望结构被填充8个字节吗?

不,因为struct mystruct是自己看到/处理的。 char已被 3 sizeof (int) -1字节填充,以使int正确对齐。这不会改变,即使有人在某个地方有时决定在另一种类型中使用这个struct mystruct