呐,原来的代码
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
}
}
假设输入的是1,2,3,4,5
现在来分析:
第一次循环:比较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,没问题了。