(3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:
class A
{
public:
void Func(void){ cout << “Func of class A” << endl; }
};
void Test(void)
{
A *p;
{
A a;
p = &a; // 注意 a 的生命期
}
p->Func(); // p是“野指针”
}
int *a;
*a=10;//典型的野指针,还不知道a指向哪里就往里写数据,会出错.
------------------------------
int *a = new int;//ok,申请了一块内存用来存储一个int值,并且把这块内存的地址赋给了a
*a=10;
-------------------------------
int i=10;
int *a=&i;//将i的地址赋给了a
*a=20;
------------------------------
int a[2]={1,2};
int *p=a;//将数组的首元素地址赋给了p;
p+=2;//将p增加2个单位,现在指向数组a最后一个元素的后一块内存
printf("p=%p\n",p);//将输出p的值,是个地址,虽然越界了,但是p本身还是有意义的
*p=3;//越界,不能往该地址下的内存中写数据,会出错
printf("%d",*p);//将p指向的那4个字节的内容按照signed int读出来,不会出错,但是这个值没有意义