野指针被赋值,危险吗?
《C++设计模式_基于QT4开源跨平台开发框架》书上P429的一段代码:
- C/C++ code
//编译器是Dev-C++...int main(){ int myint = 5; int *ptr1 = &myint; cout<<"*ptr1 = "<<*ptr1<<endl; int anotherint = 6; int *ptr2; cout<<"*ptr2 = "<<*ptr2<<endl; *ptr2 = anotherint; //+ int yetanotherint = 7; int *ptr3; ptr3 = &yetanotherint; cout<<"*ptr3 = "<<*ptr3<<endl; *ptr1 = *ptr2; //危险的赋值 cout<<"*ptr1 = "<<*ptr1<<endl;}我自己试了一下,跳出段异常,去掉注释"+"的那行后,可以输出,为什么?这句有什么毛病?
[解决办法]
*ptr2 = anotherint;//ptr2未赋值,行为不明
[解决办法]
有些内存段是只读的
[解决办法]
在C++创建指针的时候,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。由于野指指针在声明的时候并未初始化,它可能是任何值。可能会导致一些最隐匿、最难以跟踪的BUG。所以声明指针的时候最好进行初始化。
[解决办法]
跳出段异常,去掉注释"+"的那行后,可以输出,为什么?这句有什么毛病?
跳出段异常,是因为ptr2没有开辟空间,所有没有空间来容纳anotherint。
注释以后可以,因为此ptr2的值是随机的(由系统确定的),所有可以输出,但是值是随机的