C语言之结构体与GDB调试 -----Day17
一.知识点整理
1.结构体
1.1 定义
- 形式
struct 结构名
{
成员列表(类型说明符 成员名)
};
举个例子:
struct student{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
1.2 定义结构体变量方法
- 先声明结构体再定义变量名
struct student1,student2…
struct student{
int num;
char name[20];
}
int main()
{
struct student1;
}
- 声明类型的同时定义变量
struct student{
int num;
char name[20];
} student1,student2; //会把student1当做全局变量
- 直接定义结构体类型变量
一般格式:
struct
{
成员表列
}变量名表列;
1.3 结构体变量的引用
- 引用规则
- 不能把一个结构体变量作为一个整体进行输入输出,通过"."来引用结构体的变量,这里的点可以理解为“的”的意思
- 如果结构体里面嵌套另一个结构体则需要一级一级的引用下去
- 对结构体变量可以向普通变量进行运算
- 可以引用结构体变量的地址,也可以引用结构体地址
1.4 结构体数组
定义一个多个学生的结构体,代码如下:
struct student{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
int main(){
struct student[10];
}
1.5 结构体指针
- 一般形式
struct 结构名 *结构指针变量名
- 使用时需要注意
结构指针变量必须先赋值,再引用
赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。
- 将一个结构体变量的值传递给函数,有以下方法
- 用结构体变量的成员做参数
- 用结构体变量做实参
- 用结构体变量(或数组)的指针作为实参,将结构体变量(或数组)的地址传给形参
2. GDB调试
2.1 gdb简介
- gdb调试的是可执行文件,而不是程序的源代码,编译时添加:
gcc -g 源文件名称
2.2 gdb操作
- 显示源代码【可以用简写l】
list:显示10行代码
list x,y :显示x行至y行的代码
- 开始运行命令【可以用简写r】
run
- 设置和管理断点
break n :在第n行设置断点,与run和continue连用
- 下一步操作
next:表示下一步,不进入函数
step:表示下一步,进入函数
- 跟踪显示
display 变量名
二. 难点重点
1. 如何计算结构体的大小
首先需要满足一下几个规则:
第一步看操作系统:32位或64位
对齐字节数:32位默认4,64位默认8
第二步看结构体最大元素的字节数
必须为最大字节数的整数倍或者对齐字节数的整数倍,不满足则在后面补位;
第三步看是否有数组,如果有数组,不能将数组的大小看成一个整体,需要分开来看
最后一步:起始位置x对存放的元素大小要恒等于0,或对对齐字节数区域恒等于0,若不满足,则补位;
举个列子
//64位操作系统下计算该结构体的大小
struct s1{
char ch;
int a;
char d;
float;
double d;
int c;
};
首先,判断最大元素的字节数为double类型,为8,
然后,在判断下一个元素类型的字节数为4,则第一位需要补3,第三位为char类型,此时为序号为8,加上char为9,不符合需要补位3,为12
后面为float型,字节数为4,可以整除,加4,为16,
再加double型为24,
再加int为4,一共为28,不被8整除,所以再补4,为32;
最后结构体的总大小为32!
三.总结
结构体的知识相对比较实用,可以将一个个实体以及他们所具有的特征在一起进行处理,gdb的调试也对编程有了跟大的辅助帮助作业