zoukankan      html  css  js  c++  java
  • 切记要初始化指针

      今天,在写顺序栈时,开始形参传递的是通过取地址,就是用 SeqStack &S 传递,后来看到网上有用指针来传递的,于是想来改成用指针传递。

      问题来了,当我把所有的 S.top  S.data 修改为 S->top S->data 、SeqStack &S 修改为 SeqStack *S 运行时,用的是 codeblocks ,运行并未报错,可是不打印出栈中元素,运行一会就返回 Process returned -1073741819 (0xC0000005) 错误退出。为了找到具体报错位置,我挨个加了 printf() 发现了问题所在,就是只要运行到有 S->top 或 S->data 就异常退出。因为栈要初始化,所以执行到 InitStack(SeqStack *S) 下的 S->top = -1 时就异常退出。

      什么问题呢?于是我按照我的写法简单写了个测试程序。

    #include <stdio.h>
    
    typedef int DataType;
    
    typedef struct
    {
        DataType data;
        int top;
    }SeqStack;
    
    int main()
    {
        SeqStack *S;
        // 去掉注释程序就正常运行 输出 100 1
       // SeqStack address;
       // S = &address;
        S->data= 100;
        S->top = 1;
        printf("%d %d ", S->data, S->top);
    }
    

      问题就在有没有给定义的指针初始化。那要怎么去判断有指针没有初始化呢?

      下面是笔者的想法,在 codeblocks 运行时退出返回的是 Process returned -1073741819 (0xC0000005), 那么其它的呢,于是又写了个程序来测试.

     

    #include <stdio.h>
    
    int main()
    {
        int *a, b;
        //b = 100;
        //a = &b;
        printf("%d", *a);
    }

     

      运行后,同样是返回错误 Process returned -1073741819 (0xC0000005),那么会不会有野指针时,都是会有这错误呀。笔者百度了一下,发现这个错误跟内存有关,那么野指针不就是指向一个已删除的对象或未申请访问受限内存区域。 

      所以这个报错就是与内存相关,所以出现此错误时,不妨去检查与内存相关的语句吧。

      当然,重要是一个好的编程习惯!!! 定义指针时一定要初始化,野指针的缺省值是随机,它会乱指一通,不管地址是否合法,因此这样对野指针进行操作很容易造成程序错误!!

      

  • 相关阅读:
    JDK和TOMCAT环境变量配置
    MEF(Managed Extensibility Framework )的入门介绍
    这样的数据导出你知道?
    ListBox实现拖拽排序功能
    各种技术资源汇总
    大话数据结构-排序
    大话数据结构-查找
    CheckListBox的实现方式分析
    listbox里面添加WrapPanel ,支持自适应换行
    RESTful 接口实现简明指南
  • 原文地址:https://www.cnblogs.com/notfound/p/9744550.html
Copyright © 2011-2022 走看看