当前位置:首页 > 在线教育 > c语言试题(c语言编程题库100题及答案)

c语言试题(c语言编程题库100题及答案)

2020年3月计算机二级C语言题库详解。

c语言面试题,真的不简单!

大家好,今天一个最近面试国内某著名汽车制造公司的小伙伴给我发了一个面试问题,说是栽在上面的,但是没有回答。

拿到题目后,我仔细研究了一下。陷阱很多,有一定的深度和代表性。这个标题可以大致反映你目前C语言学习的水平和层次,是一个不错的标题。所以今天我就写一篇文章,推动大家来谈谈这个问题,让我们的学习尽可能符合实际的岗位需求。我不多说。请看问题:

标题很简单,可以分析它的输出。

伙伴a说,这只是把s复制到d,所以输出自然是s不变,d变成s。

伙伴b说,显然当复制到d的时候,是越界了,程序会报错然后停止运行。

合作伙伴C表示,不应该是表面越界那么简单。我得考虑一下。肯定会有陷阱。调试后我会给出答案。

这是三种说法。我们不会先评论,而是直接给出程序的运行结果:

啊?奇怪,输出d是正确的,s被截断了!说越界也应该是D的错。是什么情况?别急,让我们一步一步分析调试,找到原因。

首先,我们来回顾一下strcpy函数的原理,将一个字符串复制到一个字符串中,并在末尾追加一个null字符,但是没有越界检查,安全性堪忧。但是这个问题的运行结果是复制成功了,难道不应该越界吗?

那我们就不能再依靠分析了。我们必须找到错误的调试程序。说白了,现在的问题就在于越界。看来我们得用我们的利器printf来检查字符串存储的内存地址了,如上图所示:

看到记忆地址,我们似乎明白了些什么。D的起始地址是20,S的起始地址是30。也就是说,系统并没有像我们想象的那样只分配4个字节的内存给数组D,而是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语言基础和一定的分析能力。希望大家在以后的学习中能找到正确的方向,多努力。我们到此为止吧,谢谢!

扫描二维码推送至手机访问。

版权声明:本文由ABC留学网提供发布,如需转载请注明出处。

本文链接:https://www.jumpabc.net/zaixianjiaoyu/31642.html

分享给朋友: