千家信息网

C语言之陷阱与缺陷的示例分析

发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,本篇文章为大家展示了C语言之陷阱与缺陷的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、前言二、字符指针结论一:复制指针并不会复制指针所指向的内容。
千家信息网最后更新 2024年11月17日C语言之陷阱与缺陷的示例分析

本篇文章为大家展示了C语言之陷阱与缺陷的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一、前言

二、字符指针

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

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

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

1.经典错误①

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

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

分析:

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

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

调试后即可发现,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语言中只有四个运算符(&& ;|| ;?: ;,)明确规定了求值顺序

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

if(y!=0 && x/y>a)

如此避免除0错误。

特别注意,赋值操作符不保证任何求值顺序,即使考虑了优先级和结合性,也会有意想不到的错误

int i=0;while(i

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

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

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

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

五、运算符&& ||和!

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

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

int i = 0;while (i < tabsize && tab[i] != x){        i++;}

现分析将&&替换成&仍然能"正常工作"的原因。

原因一:只要xy的值都限制在0~1,x&&y和x&y的结果始终相同。

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

原因三:不同与&&的求值顺序,&要求两边都要被求值

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

上述内容就是C语言之陷阱与缺陷的示例分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

地址 数组 代码 元素 指针 边界 问题 分析 相同 内容 原因 栏杆 结果 错误 顺序 语言 对称 两个 个数 原则 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 java 显示数据库表 临沧软件开发 网络技术中上载是指 数据库系统概念 第6版 思科系统中国网络技术有限公司 西安华天网络技术有限公司 报考志愿数据库 张舟怡帆网络技术公司面试条件 意识形态网络安全建设 网络安全等级保护首先是定级吗 网络安全和建设讲话稿 一致性原则属于网络安全策略 计算机网络技术升本能学什么专业 无法解析服务器地址和名称 软件开发好还是产品设置好 数据库连接池性能测试 计算机网络技术职位市场分析 金华蜂巢网络技术有限公司 商务数据库分析英语翻译 凤阳工业软件开发技术怎么样 成都信息科技大学网络安全 北京核酸数据库 软件开发都有哪些方向 华为u7服务器地址设置 用于数据库的容器 关于数据库系统开发一般流程 软件开发模型比较 江苏粮食供应链服务软件开发商 软件开发小程序的公司 无线网络技术的实际应用
0