---------------------------------------------------结构体------------------------------------------------------
·结构体:不同类型的数据的组合;
//声明:结构体中存放的都是变量
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); ------>记得要释放该内存,否则会发生内存泄漏
文章评论(0条评论)
登录后参与讨论