【 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)
那我之前写的好多代码都错了啊啊啊啊啊啊