原创 结构体,结构体大小,结构体指针

2014-9-20 15:29 4533 4 4 分类: MCU/ 嵌入式

---------------------------------------------------结构体------------------------------------------------------

  ·结构体:不同类型的数据的组合;

 

  //声明:结构体中存放的都是变量

E.g

  struct my_struct {

       char A;          ---> 1

       char *pA;       ---> 4

       int  B;           ---> 4

       int  *pB;          ---> 4

    int  arryC[10];     ---> 40

  };                       ----->  total  : 53字节

可是从Debug中我们可以看到

(gdb) p sizeof(my_1)

$11 = 56字节 53 字节

 

·定义一个结构体变量:

  struct my_struct my_1;

使用结构体变量,初始化

   1 定义时初始化:

   char AA;

   int BB;

   struct my_struct my_1 = {'A',&AA,20,&BB,{1,2,3}};

 

另有GNU 结构体初始化方式:

struct my_struct my_1 = {

      .A = 'A',

       .pA = &AA,

       .B = 20,

       .pB = &BB,

       .arryC={1,2,3},

   };

   2)定义后初始化

   struct my_struct my_2;

   my_2.A = 'A';

 

★访问结构体成员   ---->  使用结构体名访问成员 --->  " 结构体变量名称.成员名 "

  

(gdb) p my_1

$1 = {A = 65 'A', pA = 0xbffff33f "1\364", ,

  B = 20, pB = 0xbffff338, arryC = {1, 2, 3, 0, 0, 0, 0, 0, 0, 0}}

(gdb) p my_1.A

$2 = 65 'A'

(gdb) p my_1.B

$3 = 20

(gdb) p my_1.pA

$4 = 0xbffff33f "1\364",

(gdb) p my_1.pB

$5 = (int *) 0xbffff338

(gdb) p *my_1.pB

$6 = 2

(gdb) p *my_1.pA

$7 = 49 '1'

(gdb) p my_1.arryC

$8 = {1, 2, 3, 0, 0, 0, 0, 0, 0, 0}

(gdb) p my_1.arryC[0]

$9 = 1

(gdb) p my_1.arryC[1]

$10 = 2

----------------------------------------------结构体大小?---------------------------------------------------

  struct my_struct {

       char A;            ---> 1

       char *pA;          ---> 4

       int  B;           ---> 4

       short  *pB;          ---> 4

       char C;            ---> 1

       int D;             ---> 4

  };                       ----->  total  : 24 字节

 

  优化结构体的定义:

    struct my_struct {

       char A;            ---> 1

       char B;          ---> 1

    char C;            ---> 1

       int  *pB;          ---> 4

    int  arryC[10];    ---> 40

  };                       ----->  total  : 48字节

 

   1)结构体分配的地址是连续的,同时要求变量的存储空间需要按“字”对齐------>32 ---> 4字节

   2)变量根据自身存储要求,按自身内存对齐的方式存放到结构体内存空间,如当前所在“字”存放不完,则令存到下一个字中。

 

------------------------------------------结构体指针-------------------------------------------------------

1)      先分配结构体变量,然后通过变量地址对指针赋值;

 

   struct my_struct *pstruct;

   struct my_struct  my_1;

   pstruct  = &my_1;

   pstruct->A = 'B';


(gdb) p my_1.A------------------>

$1 = 66 'B'

(gdb) p pstruct->A

$2 = 66 'B'

可看出pstruct-> A等价于my_1.A

pstruct->相当于* pstruct,即pstruct的解应用

 

2)  通过堆内存方式分配

    struct my_struct *pstruct;

    //使用动态堆分配方式,得到的内存空间的初值未知(原内存残留),需要初始化后才使用

    pstruct  =  (struct my_struct *)malloc(sizeof(struct my_struct));

    pstruct->A = 'B';

    pstruct->arryC[0] = 1;

    free(pstruct);         ------>记得要释放该内存,否则会发生内存泄漏

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条