野指针就是指针指向的不是一个有效(合法)的地址。
在程序中,如果访问野指针,可能会造成程序的崩溃。
出现野指针的情况主要有三种:
1)指针在定义的时候,如果没有进行初始化,它的值是不确定的(乱指一气)。
2)如果用指针指向了动态分配的内存,内存被释放后,指针不会置空,但是,指向的地址已失效。
3)指针指向的变量已超越变量的作用域(变量的内存空间已被系统回收),让指针指向了函数的局部变量,或者把函数的局部变量的地址作为返回值赋给了指针。
规避方法:
1)指针在定义的时候,如果没地方指,就初始化为nullptr。
2)动态分配的内存被释放后,将其置为nullptr。
3)函数不要返回局部变量的地址。
注意:野指针的危害比空指针要大很多,在程序中,如果访问野指针,可能会造成程序的崩溃。是可能,不是一定,程序的表现是不稳定,增加了调试程序的难度。
实例1
#includeusing namespace std; #include int main() { int *p = (int *)(0x0000000955523); cout << "*p=" << *p << endl; }
实例2
#includeusing namespace std; #include int *func() { int a = 3; cout << "a=" << a << " a的地址为" << &a << endl; return &a; } int main() { // 1.直接操作非法地址 //int *p = (int *)(0x0000000955523); //cout << "*p=" << *p << endl; // 2.如果用指针指向了动态分配的内存,内存被释放后,指针不会置空,但是,指向的地址已失效。 //int *p = new int(3); //cout << "p=" << p << "*p=" << *p << endl; //delete p; //cout << "p=" << p << "*p=" << *p << endl; //3.指针指向的变量已超越变量的作用域(变量的内存空间已被系统回收), // 让指针指向了函数的局部变量,或者把函数的局部变量的地址作为返回值赋给了指针。 int *pp = func();//函数的局部变量的地址作为返回值赋给了指针 cout << "pp= " << pp << " *pp= " << *pp << endl; }
到此这篇关于c 野指针的具体实现的文章就介绍到这了,更多相关c 野指针内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!