C++——野指针

207 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

image.png

(欢迎大家关注我的微信公众号——控制工程研习,上面会分享很多我学习过程中总结的笔记。)

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输入这段代码就会有提示,所以编译也不会通过。\

图片