对于野指针,空指针,悬空指针的思考

野指针指的是还没有初始化的指针。严格地说,编程语言中每个指针在初始化前都是野指针。

一般于未初始化时便使用指针就会产生问题。大多数的编译器都能检测到这一问题并警告用户。

int f(int i)
{
    char* cp;    //cp is a wild pointer
    static char* scp;  //scp is not a wild pointer: static variables are initialized to 0
                       //at start and retain their values from the last call afterwards.
                       //Using this feature may be considered bad style if not commented
}

scp从第一次被赋值前都是地址为0x0,但是注意这种情况,

        static int* p;
    
        {
            int i = 0;
            p = &i;
        }
        printf("%d", *p);

p最后变成了一个迷途指针,

关于迷途指针还有这样一个例子,来自wiki:

int * func ( void )
{
    int num = 1234;
    /* ... */
    return #
}
/*
这样编译器是不通过的,因为当你调用完函数的时候,一个栈帧已经关闭了,num在内存中已经释放,所以
&num也是不存在的;
*/

//还有:
#include <stdlib.h>
{
    char *cp = malloc ( A_CONST );
    /* ... */
    free ( cp );      /* cp now becomes a dangling pointer */
    cp = NULL;        /* cp is no longer dangling */
    /* ... */
}/*
使用完对他进行赋NULL是非常合适的一个做法,我们来想想迷途指针的坏处
如果以后操作系统给释放的内存重新给了一个程序,那么你这个有cp指针的程序再使用,
再操作的时候就非常危险了,你这样会修改另外一个程序的值
*/

但我觉得上面的例子可能让你们不太明白,我们再举一个例子:

int main()
{



        int *p1 = (int *)malloc(sizeof (int));
        int *p2 = p1;
        *p1 = 6;        /* p2 and p1 are pointing to the same memory */
        free(p1);            /* p1 is       a dangling pointer, so is p2  */
        p1 = NULL;
        printf("%x\n",p1);
        printf("%x",p2);            /* p1 is not   a dangling pointer any more   */
        return (*p2 & 0x7f); /* p2 is still a dangling pointer            */

}


/*

他会输出:
0
p2指的地址
如果我把p1 = NULL注释掉,则p1和p2都是悬空指针,打印出来的值是一样的,他们都指向了一个无效的地址,这里所谓无效,指的是无论是野指针还是悬空指针,都是指向无效内存区域(这里的无效指的是"不安全不可控")的指针。 访问"不安全可控"(invalid)的内存区域将导致"Undefined Behavior"
最后我们用雅虎答案上面一个人写的来总结一下:

A dangling pointer is a pointer that used to point to a valid address but now 
no longer does. This is usually due to that memory location being freed up and 
no longer available. There is nothing wrong with having a dangling pointer 
unless you try to access the memory location pointed at by that pointer. 
It is always best practice not to have or leave dangling pointers.

A wild pointer is a pointer that has not been correctly initialized and 
therefore points to some random piece of memory. 
It is a serious error to have wild pointers.
*/

克服这种错误的方法除了你释放内存的行为发生后加一个把他指为空的行为,还有一种,你也可以使用智能指针,我们以后有机会会来讨论好的。

我们今天讲讲最后一个概念:那就是空指针

这里我们选取c与指针上面的一段话来说明,标准定义了NULL指针,他作为一个特殊的指针变量,表示不指向任何东西,要使一个指针变量为NULL,你可以给他赋值为0,但你要明白机器内部而言,NULL指针的实际值可能与此不同,NULL指针的概念非常有用,表示某个特定的指针目前并未指向任何东西;举个例子:

           如果一个用于某个数组中查找某个特定值的函数可能返回一个指向查找到的数组元素的指针,如果该数组不包括指定条件的值,返回一个NULL指针。

但千万不要对一个NULL指针进行间接访问。

 

参考链接:https://www.cnblogs.com/idorax/p/6475941.html

还有维基百科关于迷途指针的用法。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值