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,没问题了。

原文地址:https://www.cnblogs.com/cnsec/p/13286823.html