【 C语言指针详解 】(七)野指针

参考网址:
http://blog.csdn.net/a2796749/article/details/46897211
http://www.cnblogs.com/mrlsx/p/5419030.html
http://blog.csdn.net/fu_zk/article/details/21030607
http://blog.csdn.net/dangercheng/article/details/12618161

野指针

定义:野指针”不是NULL指针,是未初始化或未清零的指针,他指向的内存地址不是程序员想要的。

成因:

1)指针变量没有被初始化

a.指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针。在Debug模式下,VC++编译器会把未初始化的栈内存上的指针全部填成 0xcccccccc ,当字符串看就是 “烫烫烫烫……”;会把未初始化的堆内存上的指针全部填成 0xcdcdcdcd,当字符串看就是 “屯屯屯屯……”。把未初始化的指针自动初始化为0xcccccccc或0xcdcdcdcd,而不是就让取随机值,那是为了方便我们调试程序,使我们能够一眼就能确定我们使用了未初始化的野指针。在Release模式下,编译器则会将指针赋随机值,它会乱指一气。所以,指针变量在创建时应当被初始化,要么将其设置为NULL,要么让它指向合法的内存。

char *p; //此时p为野指针

b.所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

char* p = NULL;  
char* str = (char*)malloc(1024);  

2)指针指向的内存被释放了,而指针指向没有置NULL

    int num = 6;
    int *p = &num1;
    cout<<*p<<endl;
    free(p);
    cout<<*p<<endl;  /// p是野指针

通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用。

3)指针超过了变量的作用范围

char *p=new char[10]; //指向堆中分配的内存首地址
cin>> p;
cout<<*(p+10); //可能输出未知数据

正确的做法:

a.正确的声明指针,让指针指向合法的内存区或者NULL

b.释放指针内存时,一定要先让指针执行空,再释放内存

p=NULL;
free(p)

那我之前写的好多代码都错了啊啊啊啊啊啊

c.指针如果访问超过作用范围,我没有想到什么好的办法避免这种情况下的野指针

posted @ 2017-11-06 00:43  799  阅读(2918)  评论(2编辑  收藏  举报