本文已参与[新人创作礼]活动,一起开启掘金创作之路。
(欢迎大家关注我的微信公众号——控制工程研习,上面会分享很多我学习过程中总结的笔记。)
1. 野指针的定义
野指针不是NULL指针,而是指向”垃圾“内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是”野指针“是很危险的,if语句对它不起作用。
2. 野指针的成因
(1)指针变量没有初始化。任何指针变量刚被创建时不会自动称为NULL指针,它的默认值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
3. 示例
看看下面的程序片段有什么重大的bug?
short *bufptr;
short bufarray[20];
short var=0x20;
*bufptr = var;
bufarray[0] = var;
【解析】
(1)代码第1行,正确。声明了一个short *类型的指针,并且没有对它初始化。
(2)代码第2行,正确。声明了一个20哥元素的数组,每个元素都是short类型。
(3)代码第3行,正确。声明了short类型的变量var,并且把它初始化为0x20。
(4)代码第4行,错误。将bufptr指针指向的内容赋为var变量的值。因为bufptr没有被初始化,是个”野指针“,因此对它所指向的内容操作是是是十分危险的,会导致程序崩溃。为了杜绝这种错误,可以将bufptr正确地进行初始化。代码第1行改为:
short *bufptr = (short *)malloc(sizeof(short));
(5)代码第5行,正确。把bufarray的第一个元素赋值为变量var的值。
如果在VS输入这段代码就会有提示,所以编译也不会通过。\