C语言基础程序(一):野指针

1.何为野指针?
野指针指指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。

“野指针”的成因主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如

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

(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。
如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。

char *p = (char *) malloc(100);
     strcpy(p, “hello”);
     free(p);         // p 所指的内存被释放,但是p所指的地址仍然不变if(p != NULL)      // 没有起到防错作用
     {
        strcpy(p, “world”);      // 出错
}

(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是“野指针”
}

总结

#define  _CRT_SECURE_NO_WARNINGS 
#include 
#include 
#include 

//野指针产生的原因
//指针变量和它所指向的内存空间变量是两个不同的概念
// 释放了指针所致的内存空间  但是指针变量本身没有重置成null
//造成释放的时候 通过if (p1 != NULL)

//避免方法: 1)定义指针的时候 初始化成nuLL 2)释放指针所指向的内存空间后,把指针重置成NULL。
void main11()
{

    char  *p1 = NULL;
    p1 = (char *)malloc(100);
    if (p1 == NULL)
    {
        return ;
    }
    strcpy(p1, "11112222");

    printf("p1:%s \n", p1);

    if (p1 != NULL)
    {
        free(p1);
        p1 = NULL; //释放了指针所致的内存空间,同时把指针变量本身没有重置成null
    }

    //

    if (p1 != NULL)
    {
        free(p1);
    }

    printf("hello...\n");
    system("pause");
    return ;
}

你可能感兴趣的:(c++基础)