这篇文章主要介绍“C语言的野指针与空指针是什么”,在日常操作中,相信很多人在C语言的野指针与空指针是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言的野指针与空指针是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
一:野指针
概念:野指针就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的)。
说明:指针变量也是变量,是变量就可以任意赋值。但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。
注:野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。
代码示例:
int a = 100;int *p;p = a; //把a的值赋值给指针变量p,p为野指针, ok,不会有问题,但没有意义p = 0x12345678; //给指针变量p赋值,p为野指针, ok,不会有问题,但没有意义*p = 1000; //对野指针进行赋值操作就不可以了
把a的值赋值给指针变量p,p为野指针, ok,不会有问题,但没有意义。
给指针变量p赋值,p为野指针, ok,不会有问题,但没有意义。
1.1 :野指针的成因
指针未初始化:指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它所指的空间是随机的。
代码示例:
int main(){int * p;*p = 20;return 0;}
(个人理解:指针变量有操作系统随机赋值,未指向一个具体空间,没有落脚点)
指针越界访问:指针指向的范围超出了合理范围,或者调用函数时返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
代码示例:
int main(){int arr[10] = {0};int *p = arr;for(int i = 0; i <= 11; i++){*(P++) = i;//当指针指向的范围超出数组arr的范围,p变成野指针。}return 0;}
3 .指针释放后未置空:有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。其实它们只是把指针所指的内存给释放掉,但并没有把指针本身忘记。此时指针指向的就是无效内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。
代码示例:
int main(){int *p = NULL;p = malloc(10 * sizeof(int));if (!p){return;}//成功开辟内存,可以操作内存。free(p);p = NULL;return 0;}
(个人理解:我们前一天住了个宾馆,第二天退房了,虽然我们知道一个该房间的门牌号,但是保洁阿姨已经收拾了房间,我们就不知道房间里具体是什么样的了,所以我们也没法操作了。)
2.1 :规避野指针
1. 初始化指针
代码示例:
int main(){int *p = NULL;int a = 10;p = &a;*p = 20;return 0;}
2. 避免指针越界
代码示例:
int main(){int arr[10] = {0};int *p = arr;for(int i = 0; i < 10; i++){*(P++) = i;//严格遵守有效范围。}return 0;}
3 避免返回局部变量的地址
代码示例:
int * test(){int a = 20;return &a;}int main(){int *p = NULL;p = test();printf("%d\n", *p);return 0;}
这与变量的作用域有关,局部变量存在栈区,当被调函数结束后 ,栈区上局部变量的内存空间被释放,若再去访问该空间就不合理了。
4. 开辟的指针释放后置为NULL
当指针p指向的内存空间释放时,没有设置指针p的值为NULL。free只是把内存空间释放了,但是并没有将指针p的值赋为NULL。
代码示例:
int main(){int *p = NULL;p = malloc(10 * sizeof(int));if (!p){return;}//成功开辟内存,可以操作内存。free(p);p = NULL;//避免野指针return 0;}
5. 养成良好的编程习惯
好的编程习惯可以避免很多问题,道阻且长,但行则将至!!!
二:空指针
*NULL是一个值为0的宏常量:#define NULL ((void )0)
意义:为了标志指针变量没有指向任何变量(空闲可用),在C语言中,通常把NULL赋值给此指针,这样就标志此指针为空指针,没有指向任何空间。
注意:对指针解引用操作可以获得它所指向的值。但从定义上看,NULL指针并未指向任何东西,因为对一个NULL指针解引用是一个非法的操作,所以在解引用之前,必须确保它不是一个NULL指针。
代码示例:
void test(){char *p = NULL;**//给p指向的内存区域拷贝内容**strcpy(p, "1111"); //errchar *q = 0x1122;//给q指向的内存区域拷贝内容strcpy(q, "2222"); //err}
到此,关于“C语言的野指针与空指针是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!