请选择 进入手机版 | 继续访问电脑版

[C 语言] C语言之陷阱与缺陷详解

[复制链接]
查看57 | 回复12 | 2021-9-12 19:47:29 | 显示全部楼层 |阅读模式
目次

一、前言

C语言之陷阱与缺陷详解

二、字符指针

C语言之陷阱与缺陷详解

结论一:复制指针并不会复制指针所指向的内容。两个指针所指向位置雷同 ,实际 为同一个指针。

结论而:开辟 两个数组,即使两个数组内容雷同 ,地址也绝不雷同 。

三、边界计算与不对称边界

1.经典错误①

  1. int main()
  2. {
  3. int i = 0; int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
  4. for (i = 0; i < 13; i++)
  5. {
  6. arr[i] = 0;
  7. printf("haha");
  8. }
  9. return 0;
  10. }
复制代码

计算的结果 是程序陷入死循环

分析:

1.栈区默认先利用 高地址,再利用 低地址 

2.数组内元素随下标增长,地址由低到高变化

C语言之陷阱与缺陷详解

 调试后即可发现,i与arr[9]的地址相差3字节,以是 i即为实际 不存在的arr[12].

[补充知识:ANSI c标准答应 这种用法——数组中溢界元素的地址位于数组所占内存之后,这个地址可以举行 赋值和比较,但是不能解引用(假如 数组之前存在溢界则语法不答应 )]

2.经典错误②

十米长的围栏每一米就必要 一根雕栏 支持 ,则共必要 几根雕栏 ?                               11

3、小结

雕栏 题目 你若不假思索 大概 会回答为10。雕栏 题目 的根源正是加减一带来的狐疑

对此我们坚持以下原则

原则一:思量 最简单的特例(如思量 20到10间有几个数,20-10还要+1吗。不妨思量 10到10有几个数)

原则二:过细 计算边界

而在实际 编程中,一个编程技巧则可以"一言以蔽之",即不对称边界。

x>=0 && x<16  要优于 x>=0 && x<=15

不对称边界上界-下界就是之间所包含的数。

四、求值次序

总结:c语言中只有四个运算符(&& ;|| ;?: ;,)明确 规定了求值次序

&&和||先对左边求值,只在必要 时对右边求值:

  1. if(y!=0 && x/y>a)
复制代码

云云 避免除 0错误。

特别 留意 ,赋值操作符不保证任何求值次序 ,即使思量 了优先级和团结 性,也会故意 想不到的错误

  1. int i=0;
  2. while(i<n)
  3. {
  4. y[i]=x[i++]
  5. }
复制代码

对于以上的代码,就不能确定y是否在i自增之前求值。

题目 代码1:c+--c(我们可以根据"大嘴法"判断 为c+(--c)),但c自增的先后不得而知)

题目 代码2:int a=(++i)+(++i)+(++i)  (同理)

题目 代码3:answer=func()-func()*func()    (我们不知道哪个func被先调用)

五、运算符&& ||和!

这三种运算符返回值都为0或1。在结果 为真是返回1,结果 为假是返回0。

思量 一下代码,其功能是查询表中一个特定元素

  1. int i = 0;
  2. while (i < tabsize && tab[i] != x)
  3. {
  4. i++;
  5. }
复制代码

现分析将&&更换 成&仍旧 能"正常工作"的缘故因由 。

缘故因由 一:只要xy的值都限定 在0~1,x&&y和x&y的结果 始终雷同 。

缘故因由 二:数组末端 之后的下一个元素,只要不改变他的值而仅仅是读取,没有什么大的危害

缘故因由 三:不同与&&的求值次序 ,&要求两边 都要被求值

假如 tabsize大小等于tab中元素的个数,即使i=tabsize后还会继续查找下去,陷入死循环

总结

本篇文章就到这里了,盼望 可以或许 给你带来帮助,也盼望 您可以或许 多多关注脚本之家的更多内容!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 宋长宁 | 2021-9-12 22:08:57 | 显示全部楼层
admin楼主好聪明啊!
回复

使用道具 举报

avatar 李亚兵 | 2021-9-19 17:09:17 | 显示全部楼层
很有看点!
回复

使用道具 举报

avatar 下沙消掉 | 2021-9-20 13:06:41 | 显示全部楼层
小弟默默的路过贵宝地~~~
回复

使用道具 举报

avatar 彩云彩2017 | 2021-9-21 20:23:54 | 显示全部楼层
好好学习admin楼主的帖子!
回复

使用道具 举报

avatar 直子的爱本 | 2021-10-12 03:05:28 | 显示全部楼层
知识就是力量啊!
回复

使用道具 举报

avatar 六翼天使494 | 2021-10-12 08:38:07 | 显示全部楼层
我和我的小伙伴都惊呆了!
回复

使用道具 举报

avatar 贰十岁装成熟装s | 2021-10-13 02:54:38 | 显示全部楼层
admin楼主很有激情啊!
回复

使用道具 举报

avatar 一揽众山小卑 | 2021-10-15 22:42:27 | 显示全部楼层
我回帖admin楼主给加积分吗?
回复

使用道具 举报

avatar 如心所愿1 | 2021-10-17 02:19:38 | 显示全部楼层
admin楼主写的很经典!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则