当union在c的结构内部时,sizeof()将返回什么?

时间:2018-12-14 14:28:53

标签: c struct sizeof unions

考虑此程序:

#include "stdio.h"
#include "conio.h"

void  main() {
    struct ax {
        char name[5]; //5 bytes
        union {
            float y; // 4 bytes
            int z;   // 4 bytes
        } u; // sizeof this union should be 4
    } t; //hence 4 + 5 should be 9

    printf("%d",(int)sizeof(t));

    getch();
}

为什么打印12张?

3 个答案:

答案 0 :(得分:4)

简单的答案是该结构包含填充,从而使其大小(由sizeof报告)大于其各个部分的总和。结构构件之间的填充通常存在以使每个结构构件对齐(例如,与32位或64位边界对齐)。末尾可能还会有填充,例如以使多个连续结构(例如数组)对齐。

C11标准的相关部分:

6.7.2.1(结构和联合的语义)

  
      
  1. ...结构对象中可能存在未命名的填充,但在其开头没有。
  2.   

6.5.3.4(sizeof

  
      
  1. ...当应用于具有结构或联合类型的操作数时,结果是此类对象中的字节总数,包括内部填充和结尾填充。
  2.   

答案 1 :(得分:2)

32位计算机上最可能的布局是:5字节字符+ 3字节填充+ 4字节并集= 12字节。

您可以自己查看内存布局:

#include <stddef.h>
#include <stdio.h>

printf("%zu\n", offsetof(struct ax, u)); // likely prints 8

答案 2 :(得分:0)

寻找数据对齐方式。联合将与下一个32位(或64位)地址对齐,(无论如何)在char[5]开始后8个字节。

调试实例(并查看其内存布局)将向您展示char[5]实际是如何被3个额外字节“填充”的。