zoukankan      html  css  js  c++  java
  • 【 C语言指针详解 】(七)野指针

    参考网址:
    http://blog.csdn.net/a2796749/article/details/46897211
    http://www.cnblogs.com/mrlsx/p/5419030.html
    http://blog.csdn.net/fu_zk/article/details/21030607
    http://blog.csdn.net/dangercheng/article/details/12618161

    野指针

    定义:野指针”不是NULL指针,是未初始化或未清零的指针,他指向的内存地址不是程序员想要的。

    成因:

    1)指针变量没有被初始化

    a.指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针。在Debug模式下,VC++编译器会把未初始化的栈内存上的指针全部填成 0xcccccccc ,当字符串看就是 “烫烫烫烫……”;会把未初始化的堆内存上的指针全部填成 0xcdcdcdcd,当字符串看就是 “屯屯屯屯……”。把未初始化的指针自动初始化为0xcccccccc或0xcdcdcdcd,而不是就让取随机值,那是为了方便我们调试程序,使我们能够一眼就能确定我们使用了未初始化的野指针。在Release模式下,编译器则会将指针赋随机值,它会乱指一气。所以,指针变量在创建时应当被初始化,要么将其设置为NULL,要么让它指向合法的内存。

    char *p; //此时p为野指针
    

    b.所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

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

    2)指针指向的内存被释放了,而指针指向没有置NULL

        int num = 6;
        int *p = &num1;
        cout<<*p<<endl;
        free(p);
        cout<<*p<<endl;  /// p是野指针
    

    通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用。

    3)指针超过了变量的作用范围

    char *p=new char[10]; //指向堆中分配的内存首地址
    cin>> p;
    cout<<*(p+10); //可能输出未知数据
    

    正确的做法:

    a.正确的声明指针,让指针指向合法的内存区或者NULL

    b.释放指针内存时,一定要先让指针执行空,再释放内存

    p=NULL;
    free(p)
    

    那我之前写的好多代码都错了啊啊啊啊啊啊

    c.指针如果访问超过作用范围,我没有想到什么好的办法避免这种情况下的野指针

  • 相关阅读:
    【leetcode】1. Two Sum
    【leetcode】32. Longest Valid Parentheses
    【leetcode】20. Valid Parentheses
    scala细节
    【转】CentOS下firefox安装flash说明
    Spring 容器(一)
    源码学习快捷键
    Gradle编译spring3.x报错找不到itextpdf4.2.2解决方案
    Insertion Sort
    Bubble Sort
  • 原文地址:https://www.cnblogs.com/sxy-798013203/p/7790376.html
Copyright © 2011-2022 走看看