zoukankan      html  css  js  c++  java
  • xxx的纠错(1)

    呐,原来的代码

    int LsitFind(SeqList *L, int x) {
        int i;
        for (i = 0; i < 5; i++) {
            if (x == L->list[i])
                return i;
            else
                return -1;
        }
    }
    int main() {
        SeqList *list1;
        int i, b;
        for (i = 0; i < 5; i++)
            scanf("%d", &list1->list[i]);
        b = LsitFind(list1, 3);
        printf("%d", b);
        return 0;
    }

    错误分析:
    这里写图片描述
    错误提示说:Run-Time Check Failure #3 - The variable 'list1' is being used without being initialized.
    这句话表明list1未初始化
    调试程序:
    这里写图片描述
    可以看到因为没有初始化list,导致无法读取其中的数据。
    那是不是将它初始化就好了呢?
    现在将其初始化:

    list1->list[0] = { 0 };//初始化

    调试结果:
    这里写图片描述
    还是同样的问题,问号表示无法读取内存
    其实那样初始化是有问题的,但是是不是想着可以这样

        SeqList *list1 = NULL;

    是不是就好了呢?
    再调试,然而:
    这里写图片描述
    这样的确初始化了,但是出现这种情况,原因不知。
    虽然之前的数组可以这样写:

    int arr[10]={0};//开辟空间并初始化
    int *a=arr;//a指向arr的首地址

    但这里是数组,对于结构体是不行的。
    需要手动为结构体分配内存空间

        list1 =(SeqList*) malloc(sizeof(SeqList));
        //list1就是分配的内存的首地址,分配的长度为SeqList类型个长度
        //函数void malloc(int length)是用来分配空间的,在stdlib.h头文件中
        //而且要把`void`类型强制转换为`SeqList*` 类型

    现在再来调试:
    这里写图片描述
    呀,对了把,但是,结果呢?结果还是不对。
    所以,再分析ListFind函数:

    int LsitFind(SeqList *L, int x) {
        int i;
        for (i = 0; i < 5; i++) {//循环5次
            if (x == L->list[i])//如果x=L->list[i]
                return i;//返回下标
            else//如果不等
                return -1;//则返回-1
        }
    }
    假设输入的是12345
    现在来分析:
    第一次循环:比较x和L->list[i],相等吗?不相等,调到else
              返回-1//注意一旦返回,后边的所有内容都不会执行了,包括后边的循环
              所以,只要第一个数不是3,永远返回-1.
              那你是不是会想,第一个数如果是3呢?
              第一次比较,相等,进入if语句,返回i,此时是第一次循环,i=0;所以只会返回0

    那么怎么改呢?
    只需要这样:

    int LsitFind(SeqList *L, int x) {
        int i;
        for (i = 0; i < 5; i++) {//循环5次,没问题
            if (x == L->list[i])//如果x=L->list[i]
                return i;//返回下标,后面的不管有多少代码,都不会执行了
                //如果不相等,就什么也不做,继续下一次循环!
        }
        //那么什么时候会执行到这里呢?就是直到循环结束也没有x和L->list[i],进不到if语句,就返回不了
    //既然循环都结束了,没有找到,当然是返回-1啦,所以在循环外边返回-1
        return -1;
    }

    再来看运行结果:
    这里写图片描述
    这下对了吧,值为3的下标为2,没问题了。

  • 相关阅读:
    2017.11.20 事务
    Linux常用指令
    11.17 知识整理
    不太熟的sql语句
    MySQL关联查询
    2017.11.09 vi编辑器指令
    Linux操作指令
    线程安全,同步锁(同步方法和同步代码)
    多线程
    序列化和反序列化
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286823.html
Copyright © 2011-2022 走看看