21年5月24说说结构体

C/C++的结构体, 不是定义, 是设计一个类型.

这个类型是不占空间的, 只有用它定义了变量之后, 才开辟空间(占空间).

关于结构体对齐计算大小 >> 1 根据下一个成员及其类型确定当前的大小

             2 根据最大的类型, 确定最终的大小

结构体有联合体的时候

struct student
{
  char a;
  union ad
  {
    int aa;
    int bb;
  };
};
struct student
{
  char a;
  typedef union add
  {
    int aa;
    int bb;
  }as;
};

主函数代码统一如下

int main()
{
  struct student s1;
  int size = sizeof(s1);
  printf("%d",size);

return 0;
}

第一个的, 这个时候s1的大小是1,  因为union只是设计了一个类型, 并没有定义变量  ( 在main里面 student::ad y; 就可以定义一个联合体变量了 )

第二个的( 注意typedef ), 这个时候s1的大小也是1, 不管 add 和 as 有没有, 都是1. 因为这里的 as 并没有定义变量, 只是 typedef 起的别名.



struct student
{
  char a;
  union 
  {
    int aa;
    int bb;
  };
};
struct student
{
  char a;
  union add
  {
    int aa;
    int bb;
  }as;
};

第一个的,  s1的大小是8,  对齐之后的结果.   因为这个是无名的联合体,  被当作一个成员在看待.  struct里面的成员.

第二个的,  s1的大小也是8,  注意这里的 add 是联合体的名字,   as 是这个联合体定义的一个变量.  (类型不开辟空间, 变量开辟空间 )

    第二个里面 没有 typedef,  这是区别于之前的关键所在

 

总结:

  这里是在struct 里面以 union 为例子,  但是道理都是相通的.   struct 里面再嵌套一个struct  (而不是union),   同样满足这些规则.

  类型是不占空间,   变量才占.



Linux学习笔记
原文地址:https://www.cnblogs.com/zealwang/p/14803455.html