C语言相关知识——野指针和空指针以及二级指针

1.野指针

  • 定义:访问了一个已经销毁或者受限的内存区域外的指针,这个指针也被称为野指针
  • 野指针产生的场景:
  1. 变量未初始化,通过指针访问该变量
    int a;
    int *p = &a; //p就是野指针
    ptf(*p); //访问野指针,但是数据不安全
  2. 指针变量未初始化
    int *p = NULL; //此时的p也是野指针
    ptf(*p);
  3. 指针的内存空间被(free函数)回收了
  4. 指针函数中直接返回了局部变量的地址
  5. 指针指向数组以外的地址(下标越界)
  • 如何避免野指针:
  1. 写代码要养成两个习惯(通过编码规范避免)
  2. 指针变量要及时初始化,如果暂时没有对应的值,建议赋值为NULL
  3. 数组操作(遍历,指针运算)时,注意数组的长度,避免越界
  4. 指针指向的内存空间被回收,建议给这个指针变量赋值为NULL
  5. 指针变量使用之前要检查它的有效性(以后开发中要做非空校验)

说明:NULL是空常量,它的值是0,这个NULL一般存放在内存中的0X00000000位置,这个地址只能存放NULL,不能被其他程序修改

2.空指针

空指针,又被称作悬空指针:当一个指针的值是NULL,这个指针被称为空指针;对空指针访问时出现报错(段错误)

3.二级指针

  • 定义:二级指针,又被称作多重指针,引用一级指针的地址,此时这个指针变量就得定义成二级指针。
  • 定义格式:
数据类型 **变量名 = 指针数组的数组名或者一级指针的地址

举例:

// 字符型指针数组
char *arr[3] = {"abc","aaa034","12a12"};// 等效于:char arr[3][6] = {"abc","aaa034","12a12"}
// 定义二级指针并赋值(指针需要跟依赖的源同类型)
char **p = arr;// 正确
int array[2][3] = {{1,2,3},{11,22,33}};
int **k = array;// 编译报错,数据类型不相符(二维数组不等于指针数组)
int a = 90;
int *p = &a;// 一级指针
int **k = &p;// 正确,二级指针
  • 结论
1. 二级指针和指针数组是等效,和二维数组不等效
2. 二维数组和数组指针是等效,和二级指针不等效
  • 二级指针的用法:
1. 如果是字符的二级指针,可以像遍历字符串数组一样遍历它
2. 如果是其他的二级指针,就需要解引用两次访问它所指向的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值