指针函数
int *func();
本质:函数 特殊之处在于返回值为指针(地址) 注意:返回值的地址是否有效。能否使用。不能返回局部变量的地址 能返回的地址:
1.全局变量的地址
2.传入参数的地址(主函数中的地址传入被调函数中)
3.static修饰的地址
4.字符串常量的地址
5.malloc 申请的空间
函数指针:
int (*p)();
本质:指针
存放函数的地址,指向一个函数的入口地址(函数名) 定义:<数据类型>(*<函数指针名>)(<形参>)
int (*p)(int a,int b);
<数据类型>:函数指针 指向的 函数的返回值 函数的数据类型
<形参>:与函数指针所指向的函数的形参一致(相当于声明),形参名可以省略
目的:指针可以指向很多类型相同的函数(参数,返回值一致),相当于调用的地方不变,函数的功能更加的通用
回调函数
主要结构: 主函数 调用函数 被调用函数
c语言中,被调函数通常以函数指针(指向对应函数入口)实现
函数指针数组:
int (*arr[4])(int,int);
数组里,指针指向参数为两个整数的函数地址
动态分配内存:
> 可以使用malloc
1.动态分配函数 头文件
#include <stdlb.h> 函数原型:void malloc(size_t size) 功能:在堆区是分配内存 参数: size:想要分配的大小 返回值: 成功:返回分配号的内存的首地址 失败:返回null 想要分配的内存的类型是int char*
需要强制类转换
> 动态内存的释放 man free 头函数#include 内存的首地址 函数原型void free(void *ptr);
功能:释放动态分配的内存 参数 ptr 内存的首地址 返回值:无
> tip:
什么是野指针? 当指针的内存被释放掉之后,用户继续操作这个指针,此时这个指着就是野指针。
怎么规避野指针? 在释放完指针的内后,将指针赋值为null
什么叫内存泄漏?、 用户动态分配的内存,没有释放或者不能释放,导致内存泄漏。 内存泄漏可能导致系统宕机
使用gdb
gdb对代码调试
Segmentation fault (core dumped)
编译时需要一个-g的参数
gdb file.c -g
使用gdb程序
gdb a.out
获取帮助信息:
help
查看代码
l //默认显示前十行
l // 可向下查看十行
l - //向前显示十行
添加断点
b //行号
如何查看断点
info b
删除断点
delete 断点号
运行代码
r 运行代码,在断点停止
继续运行
c 继续运行
查看数据
p //变量
watch //变量
单步运行
n //单步运行
退出调试
q //退出