zoukankan      html  css  js  c++  java
  • 野指针?空指针?

    指针指的是指向不可用内存的指针。任何指针变量在被创建时,不会自动成为NULL指针(空指针),其缺省值是随机的,所以,指针变量在创建的同时应当被初始化,或者将指针设置为NULL,或者让它指向合法的内存,而不应该放之不理,否则就会成为野指针而同时由于指针被释放(free或delete)后,未能将其设置为为NULL,也会导致该指针变为野指针。虽然free和delete把指针所指的内存给释放掉了,但它们并没有把指针本身干掉,一般可以采用语句if (p != NULL)进行防错处理,但是if语句却起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。第三种造成野指针的原因是指针操作超越了变量的作用范围。

    例如如下程序示例。

    #include <stdio.h>
    #include <stdlib.h>
    
    #include <string.h>
    
    int main()
    
    {
           char *p = (char *) malloc(100);
    
           strcpy(p, "hello");
    
           free(p);
    
           if(p != NULL)
    
                  printf("Not NULL
    ");
    
           return 0;
    
    }

    输出:

    Not Null

    上例中,虽然对p执行了free操作p 所指的内存被释放掉了,但是p所指的地址仍然不变,在后续的判断p是否为NULL时,根本没有起到防错的作用,所以程序输出仍然为Not NULL。

    空指针是一个特殊的指针,也是唯一一个对任何指针类型都合法的指针。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的内容。为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL,程序里可以写 p = 0 或者 p = NULL,两种写法都把p置为空指针值。C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。

    作为一种风格,很多程序员一般不愿意在程序中到处出现未加修饰的 0,所以习惯定义预处理宏 NULL(在 <stdio.h> 和其它几个头文件中)为空指针常数,通常是0 或者 ((void *)0)。希望区别整数0和空指针0的人可以在需要空指针的地方使用 NULL。

    通用指针可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。

    #include <stdio.h>
     
    
    int main()
    
    { 
    
           int n=3, *p;
    
           void *gp;
    
           gp = &n;
    
           p=(int *)gp;
    
           printf("%d
    ",*p);
    
           return 0;
    
    }

    输出:3

    转自:http://www.jobcoding.com/basic-knowledge/null-pointer/程序员面试笔试宝典

  • 相关阅读:
    False注入,以及SQL注入技巧总结
    xdebug插件攻击
    RPO攻击
    教务处sso设计缺陷
    MD5的Hash长度扩展攻击
    AMAZON PRICE TRACKER, AMAZON PRICE HISTORY, AMAZON PRICE DROP ALERT | DROPGG.COM
    弄懂JDK、JRE和JVM之间的联系。
    MyBatis配置及学习
    Cannot forward after response has been committed 异常原因
    bbs论坛中的问题和心得。(更新)
  • 原文地址:https://www.cnblogs.com/youxin/p/3295740.html
Copyright © 2011-2022 走看看