Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过将结构嵌套在联合中为其生成填充字节_C_Struct - Fatal编程技术网

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

C 通过将结构嵌套在联合中为其生成填充字节,c,struct,C,Struct,我当时是想重申我对结构填充的理解。我现在有一个疑问。当我这样做的时候: #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) { unio

我当时是想重申我对结构填充的理解。我现在有一个疑问。当我这样做的时候:

#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个字节吗?如果我显式地将8个字节填充到结构中,那么将其嵌套在这样的联合中的全部目的都将无效

我觉得声明一个包含结构和字符数组的并集(结构的大小应该是,但不是)为更整洁的代码让路


有没有办法让它像我所希望的那样工作

默认情况下,
struct
是填充的,因此
intb
字段在
sizeof(int)
边界上对齐。有几种解决方法:

  • 在需要的地方明确使用填充词:
    chara;字符a[sizeof(int)-1];int b
  • 使用依赖于编译器的pragma在字节边界上打包
    struct
  • 使用命令行开关等

默认情况下,
struct
是填充的,因此
intb
字段在
sizeof(int)
边界上对齐。有几种解决方法:

  • 在需要的地方明确使用填充词:
    chara;字符a[sizeof(int)-1];int b
  • 使用依赖于编译器的pragma在字节边界上打包
    struct
  • 使用命令行开关等
我不应该期望结构被填充了8个字节吗


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

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


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

从逻辑上考虑它

想象一下,我有一个包含一些基本类型的联合体:

union my_union{
    int i;
    long l;
    double d;
    float f;
};
您是否希望
sizeof(int)==sizeof(double)


内部类型将始终保持其大小,但联合体将始终足够大以容纳其任何内部类型。

从逻辑上考虑

想象一下,我有一个包含一些基本类型的联合体:

union my_union{
    int i;
    long l;
    double d;
    float f;
};
您是否希望
sizeof(int)==sizeof(double)


内部类型将始终保持其大小,但联合将始终足够大以容纳其任何内部类型。

使用什么编译器以及哪些选项?联合将足够大以容纳任何内部类型,但内部类型不会被填充以适合其他内部类型。“[…]结构的大小应该是[填充]”为什么?什么意义/用途?好处是什么?使用了什么编译器和哪些选项?联合将足够大以容纳任何内部类型,但内部类型不会被填充以适合其他内部类型。“[…]结构的大小应该是[padded]”为什么?什么意义/用途?增益是多少?
sizeof(int)
没有固定为4。@user4419802:正确&谢谢!修正…-:-)“这不会改变,即使有人在某处决定在另一个类型中使用这个结构mystruct。”啊哈!这正是我错过的。
sizeof(int)
没有固定为4。@user4419802:正确&谢谢!修正…-:-)“这不会改变,即使有人在某处决定在另一个类型中使用这个结构mystruct。”啊哈!这正是我所遗漏的。我不希望它适用于您提到的原始数据类型。但是当您考虑像结构那样的用户定义的数据类型时,实际上可以应用不同的逻辑,但事实并非如此。如果我在联盟外部声明了结构并在联盟内部定义了它的一个实例,我一开始就不会感到困惑!不管怎样,谢谢:-)@Adithya它是联盟内部的原始结构还是组织结构都没有区别。那只是为了说明你的思维错误。任何类型都将被视为
联合体之外的类型
。没有“不同的逻辑”可以应用。我不希望它适用于您提到的原始数据类型。但是当您考虑像结构那样的用户定义的数据类型时,实际上可以应用不同的逻辑,但事实并非如此。如果我在联盟外部声明了结构并在联盟内部定义了它的一个实例,我一开始就不会感到困惑!不管怎样,谢谢:-)@Adithya它是联盟内部的原始结构还是组织结构都没有区别。那只是为了说明你的思维错误。任何类型都将被视为
联合体之外的类型
。不能应用“不同的逻辑”。