结构体大小sizeof的理解

在32位编译环境中 sizeof的用法


  sizeof(char)     1

  sizeof (int)              4

  sizeof(unsigned int)  4

   sizeof(long int)          4

    sizeof(short int)        2

   sizeof(float)                4

   sizeof(double)          8


2.指针变量的sizeof

 char *pc="abc";

sizeof(pc)      4

sizeof(*pc)      1

 int *pi

 sizeof(pi)     4

 sizeof(*pi)     4

 char **ppc=&pc;

sizeof(ppc);   4

sizeof(*ppc)   4

 sizeof(**ppc)   1

 void(*pf)()   sizof(pf) 4;


 4数组的sizeof

 char a1[]="abc";

  int a2[3];

  sizeof(a1)//结构为4 ,还有一个结束符

  sizeof(a2)//结果为12


结构体的sizeof

  struct MyStruct

  {

      double dda1;     8

       char dda;            1

       int type;              4

 };

  结果为16, 存储变量时地址要求对齐,需遵循两条原则:

   1.结构体变量中成员的偏移量必须是成员大小的整数倍

   2.结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。

 该成员变量占用sizeof(double)=8,接下来为第二个成员dda分配空间,这时下一个可以分配的地址对应结构的起始地址的偏移量为8

是sizeof(char)的整数倍,sizeof(int)=4;

 

struct MyStruct

{

  double dda1;

  char dda  ;

}

运行结果16;

 

含有联合的结构体的sizeof

struct s1

{

    char *ptr,ch;  //有指针变成4+4

    union  A

    {

        short a,b;

        unsigned int c:2,d:1;

    };

    struct s1*next;   //指针占4

}

这样运行结果是8+4=12

 

typedef Mystruct{

 uint8_t i;

 uint8_t num[10];

 

}

运行结果是11


typedef Mystruct{

  uint8_t i;

  uint8 _t *p;

  uint8_t num[10];

}

sizeof(MYstruct)运行结果 20


typdef Mystruct{

 uint8_t i;

 uint8_t *p;

 uint8_t num[10];

}

typedef struct{

   Mystruct *p1;    //4

   double a;         //8

   uint32_t b;       //4

   uint8_t  c;       //1

}length

 sizeof(length)运行结果是24


typedef struct{

   Mystruct p1;       //20  

    double a;        //8

    uint32_t b;     //4

    uint8_t c;     // 1

}length;

sizeof(length)运行结果40;

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值