9、gdb 调试
用于调试代码种逻辑错误,而非语法错误
9.1、gdb调试流程
1、生成可以使用gdb调试的执行文件、
gcc -g xxx.c // 生成的文件可以使用gdb调试
2、进入gdb工具
gdb 可执行文件 // 使用gdb工具开始调试可执行文件
r/run // 运行代码
l/list // 显示当前行下面10行代码
b/break 函数名或者行数 // 添加断点
info b // 查看断点信息
d/delete num // 删除断点
n/next // 单步调试程序,如果是函数则整体执行,不会进入函数内部
s/step // 单步调试程序,如果是函数则进入函数内部
p/print // 查看变量的值
![]()
运行代码 ![]()
查看代码 ![]()
设置断点 在 add 函数处添加断点,然后运行程序,就会停在第5行,实际是从12行调用到第5行,也就是add中return的位置
执行 n,继续走一行,来到第6行再执行n,也就是return返回,来到第13行![]()
查看断点 ![]()
删除断点 通过core文件,查看段错误
10、指针与函数
10.1、指针函数
本质上是函数,函数的返回值是地址
存储类型 数据类型 *函数名(形参)
{
函数体;
return 地址;
}
10.2、函数指针
10.2.1、函数指针定义
本质上是指针,指向函数的指针——函数名
存储类型 数据类型 (*函数指针名)(形参列表)
// 数据类型:指向函数的返回值类型一致
// 指向函数的参数列表,数据类型一致(只写数据类型即可)
10.2.2、通过函数指针,调用函数
指针完全代替函数名
函数指针可以将函数作为参数传递给其他函数调用
返回值和参数为空
函数指针指向指针函数
1. char *fun(int a, int b);
char *(*p)(int, int) = fun;
2. void fun1(char *spl, int **st, int n);
void (*p)(char *, int **, int) = fun1;
3. void *fun2(int (*sp)[3], int m)
void *(*p)(int (*)[3], int) = fun2;
10.3、函数指针数组
本质是数组,元素同类型的函数指针,函数的参数和返回值都相同
10.3.1、定义格式
存储类型 数据类型 (*名[元素个数])(形参列表)