关于顺序表操作的一点说明

在一起学习完顺序表的操作之后,不知道你有没有这样的疑问,譬如这个函数:

SqList* CreateList(SqList* L,ElemType a[],int n){
    int i=0,k=0;
    L = (SqList*)malloc(sizeof(SqList));
    while(i < n){
        L->data[i]=a[i];
        i++;
        k++;
    }
    L->length=k;
    return L;
}

在这个函数中,我把它的返回值设定为了SqList* 类型,最后用一个指向已创建好的顺序表的指针作为返回值。但是我为什么不把它的返回值类型写成void呢?直接将指针传参进去,经过函数内部的一番操作,直接调用CreateList()函数不就可以得到一个新的顺序表了吗?事实证明,根本没有那么简单!

我们一起来调试一下看看究竟。请打开你的IDE,一起来debug一下吧。以创建顺序表La为例,在main函数里面声明La这一指针变量时,它的地址是0x401f5b.

接着,在调用CreateList()函数的时候,由于函数对La使用了malloc函数,使得malloc函数为La分配了一块新的存储空间。

这时,La的地址改变了:

它不再指向0x401f5b这块内存了。

也就是说,在函数内部,函数所有对L的操作都是对0xb21718这块新内存,而不是对0x401f5b。

等到这个建表操作结束,我们发现,La的值又回到了0x401f5b,

扫描二维码关注公众号,回复: 9714832 查看本文章

函数之前只对之前的0xb21718这块内存做了手脚,怎么会改变现在的0x401f5b呢?二者一点关系也没有。

也就是说,函数调用结束,La仍然是一个指向任意区域的野指针,其并没有创建新的顺序表,这样一来,创建新的顺序表用void肯定是不可行的了。那么该怎么办呢?就是用我上一篇Blog里的方法,用SqList*作返回值,函数调用完毕回到main函数里面再将函数的返回值赋值给La。

于是,一个成功的建表操作就完成了。

在这里特别提醒大家,当你运行代码遇到问题的时候,一定要勤于调试,而不能肉眼去观察,你一天都找不出来的错误很可能调试5分钟就出来了。所以切记,调试是编写程序的一个非常有效的工具!很多大企业里面的优秀程序员的F11键都被摸得锃亮,所以,是不是又找到了一条通往成功的秘诀呢?哈哈。

其实我的代码的可分析点并不只有CreateList()函数,其他还有,比如InitList(),UnionList()。大家可以自己调试一下,看看道理是不是和CreateList()一样。有什么想法和疑问,欢迎留言交流!

发布了7 篇原创文章 · 获赞 5 · 访问量 136

猜你喜欢

转载自blog.csdn.net/weixin_45264145/article/details/104745146