C语言数据结构易错知识点(1)

前言:C语言语法相关的知识点整理在C语言相关概念和易错语法(1)~(9)

从今天开始,我会分享C语言的数据结构相关的感悟和经验。我不会专门去强调过于基本的东西,因此我的文章主要用于复习,其中会插入一些关于C语言知识的分享(前面没提及或易错的),文章可能会有错误,欢迎指正!

1.底层实现的数据结构在提供接口时,往往会有多个.c和.h文件,一般来说会把库函数和函数声明放在头文件中。

但难点在于当有2个甚至更多.h文件时,很多人并不知道把声明和库函数的引用放在哪个文件里,从而出现相互引用的情况,例如在test1.h里引用test2.h,又在test2.h中引用test1.h,这在逻辑上是一种死循环,肯定是行不通的。

下面提供一种解决思路:

这里相当于将所有的.h文件串联起来,在外壳上引用库函数,在接口上引用外壳,.c文件引用接口。最关键的是在外壳上还需要使用声明这个功能,有可能test1.h要用到test2.h的一些变量、函数,这个时候在test1.h里面声明该变量或函数即可。

2.多字符的字符常量

我们都知道,字符对应其ASII码值,如'a' == 97,97的二进制表达是0110 0001,那么'aa'是否有含义呢?'aaa','aaaa','aaaaa'呢?多字符的字符常量其实是有意义的,但最多是四个字符。

对于'aa'其值是两个'a'的二进制值连起来,即0110 0001 0110 0001,也就是24929,'aaa'就是

0110 0001 0110 0001 0110 0001,即6381921,'aaaa'是0110 0001 0110 0001 0110 0001 0110 0001,即1633771873,这个时候我们发现这个数字已经使用了4个字节,如果再加上'a',就会报错

字符常量最多支持int,所以多字符最多有4个字符,但这种写法不提倡

下面是相关截图,可以对比一下前面分析的结论:

3.数据结构的栈和堆与操作系统的栈和堆没有关联,我们之前说的栈区、堆区、静态区是指操作系统中的内存区域划分,和数据结构的栈和堆没有任何关系。

4.顺序表的在内存中存储的方式

数据结构中,指针非常常见,但在接触顺序表、链表之后,可能会产生混淆,对顺序表在内存中存储的方式产生了模糊、错误的理解,导致经常造出野指针,这篇博客会主要分享顺序表的存储。

观察下面的代码,new1和new2有什么区别?它们在后续其它相关接口的实现上应该分别注意些什么?这两种创建顺序表的方法在内存中的存储有何不同?一般情况下使用哪种创建方法?

new1:要注意,new1仅仅是开辟了4/8个字节的栈区空间,SeqList*仅仅意味着这个指针能正确访问SeqList这种类型的空间,而相应空间arr,size ,capacity都没有被开辟出来,所以如果采用new1,一定要注意必须先在堆区把这块SeqList的区域开辟出来。

这张图可知SeqList需要在堆区创建,在栈区通过这个new1指针来控制这块区域的几个变量,这个时候注意arr也是一个指针,意味着arr对应的数组也还没有被开辟出来,需要针对arr再开辟capacity个大小的空间,这部分空间也是在堆区上开辟的。

如果使用new1,一定要注意指针之间的关系,要通过两个malloc来创建顺序表,其中new1存储的值是堆区里SeqList的地址(初始化时要传二级指针,传址,这样才能改变new1存储的值),arr又作为DataType*类型的指针维护DataType数据

new2:new2是比较推荐的一种创建顺序表的方式,这种创建方式可以在只用一次malloc的情况就把顺序表创建好了,更不容易混淆。

少用的那次malloc实际上是在创建SeqList new2时就创建了,这时arr,size,capacity存储在栈区上

这个时候我们只需要在堆区创建capacity个DataType的空间,再交给arr去维护就好了

在实现接口时,new2需要传地址(一级指针)。

上面两种创建顺序表的方式都可以,但要注意第一种相对来说更加复杂,也没有必要,所以使用第二种办法更好。

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值