一道C语言面试题,真的不简单!

 

      大家好,今天有位近期面试我国某著名汽车制造公司嵌入式岗位的小伙伴给我发来了一道面试题,说是栽在上面了,没答上来。

      我拿到题目后好好研究了一下,确实陷阱不少,有一定的深度和代表性,此题可以大致反映你C语言学习目前的层次和水平,是道好题。所以今天就写篇推送给大伙好好讲讲这道题,也让我们的学习尽可能和实际岗位需求接轨,话不多说了,请看题:

      题目描述很简单,让你分析它的输出。

免费领取c++学习课程视频加薇芯:chulan980

      小伙伴A说,这不就是把s复制到d嘛,所以输出自然是s不变,d变为s了啊。

      小伙伴B说,很明显复制到d时越界了啊,程序会报错然后停止运行啊。

      小伙伴C说,应该没有表面上越界这么简单,我得好好思考一下,肯定会有陷阱,等我调试一下再给出答案。

      以上是3种说法,我们先不评论,直接给出程序运行结果:

      咦?很奇怪,输出d是正确的,s发生了截断!要说越界也应该是d错啊,这是什么情况?大家不要着急,我们一步步来分析调试找原因。

      首先我们先来回顾一下strcpy函数的原理,把一个字符串复制到一个字符串上并在末尾追加空字符,但没有越界检验,安全性堪忧。但此题看运行结果是复制成功了,不应该是越界吗?

      那再往下就不能靠分析了,得调试程序找错了,说白了现在问题就在越界这里,似乎得用我们的利器printf查看字符串存储的内存地址了,上图:

      看到内存地址我们好像明白了点什么,d的起始地址为20,s起始地址为30,也就是说系统并不是跟我们想像的那样给数组d只分配了4字节的内存,而是分配了16字节(内存地址为16进制)!

      到这里,基本就全明白了,应该是把s复制到d中时,26个字母占用26字节确实越界了,占用了s本身的一些存储空间,d原来的16字节空间存了到p的16个字母,从q开始剩下的10个字母把原先s中的前十一个字母覆盖了(因为strcpy还追加了空字符),当最后打印%s 时,直到空字符打印才停止,因此d打印正确,s只打印了从q开始的10个字母,我们把s改为10个字母来验证一下我们的推测:

      

       结果正确!当然,具体给d分配多少空间可能取决于编译器和系统的具体实现,但可以肯定的是只要不够27字节,s肯定会发生截断,而且在d仅为字符串123的前提下,d的空间99%不会达到27字节,也就是s很大几率要截断。

      此题还有一点没讲,如果把s和d的那两行代码交换一下位置会发生什么呢?这个就留给大家吧,提醒一下没那么简单哦!

     

      最后我们总结反思一下,开头我们说这道题可以大致反映你C语言目前的学习层次,就像A,B ,C三个小伙伴一样,分别为一般,还可以,比较扎实,当然也不能断章取义,说的是大致反映。可以看出,真实的面试题并不简单,需要扎实的C语言基础和一定的分析能力,希望大家在后面的学习中找准方向、多加努力,就说到这里吧,谢谢各位了!

*声明:内容与图片均来源于网络(部分内容有修改),版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

猜你喜欢

转载自blog.csdn.net/weixin_44970764/article/details/89493509