LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: zywwzy

我今天为招聘新员工出的C语言考题

[复制链接]
发表于 2005-11-15 18:31:42 | 显示全部楼层
我还是在校生,看来C够我学的。以前自以为学得不错,惭愧惭愧!
回复 支持 反对

使用道具 举报

发表于 2005-11-16 10:16:35 | 显示全部楼层
牛气
回复 支持 反对

使用道具 举报

发表于 2006-1-27 10:49:09 | 显示全部楼层

赞成

Post by gooddaytolinux
1. 在win2k的操作系统下,使用Visual Studio2003带的编译器,输出结果是
24,32,48。如果是Debug版本,程序运行时会出错。
2. 在TurboC2.0下,char是1个字节,int是2个字节。输出结果是24,32,48
如果先定义var2(char),输出结果是0,32,48
3. 在GCC下,char是1个字节, int是4个字节。输出结果是0,32,48。

从2和3看来,编译器不同,变量在内存中的分布也是不同的,结果也就不同拉。

ps:楼主出题应该慎重和谨慎,这种有不确定答案的题还是少出。



招聘性质的题目应当严谨. 学生们不容易.

当然在实际工作中,这种题对提高DEBUG能力是有帮助的,这种就是所谓的经验值(其实还是跟理论基础有关的), 有位叫林锐的哥们写了一本书,建议所有做C/C++开发的人读一读.
回复 支持 反对

使用道具 举报

发表于 2006-1-27 18:05:11 | 显示全部楼层
感觉这个题目有些偏。毕竟sscanf()用的很少阿。
回复 支持 反对

使用道具 举报

发表于 2006-2-4 01:12:14 | 显示全部楼层
与其说是在考c语言,不如说是在考编译原理和ia32的知识,至于sscanf反正我是可以猜出来的。我觉得不同的编译器应该结果是不同的 。
回复 支持 反对

使用道具 举报

发表于 2006-10-20 13:06:50 | 显示全部楼层
我在SUN6900上用CC编译得到的结果:var1=8216,var2=0,var3=48,从这个结果能说明我用的工作站的哪些方面?我是初学者
回复 支持 反对

使用道具 举报

发表于 2006-10-23 21:18:55 | 显示全部楼层
楼上的做什么的?居然有sun的工作站。
intel的都是小头的,sun的是大头。
google:big endian
回复 支持 反对

使用道具 举报

发表于 2006-10-27 10:15:41 | 显示全部楼层
就算有缓冲区溢出也不一定是什么问题代码,做通信或者控制程序的时候,经常要让一些数据被截断的.

CRC循环校验码校验就是缓冲区溢出的一个应用,不是吗?

如果我是你,我也会对那些高级程序员挺失望的.
回复 支持 反对

使用道具 举报

发表于 2006-10-27 17:16:02 | 显示全部楼层
Post by libinary
这个题不太好吧,不同的编译器可能有不同的结果,加上优化选项也可能有不同的结果,之所以有这样的结果是因为缓冲区溢出, sscanf(str_val2,"%d",&var2)中的var2是char,只占一个字节,当作为%d格式的时候实际写了4个字节,声明的时候var1在var2前面,所以就把var1覆盖了3个字节,这和机器堆栈的生长方向也有关,如果栈是向上生长的就没有这种效果,还和str_var的值有关,var1太大就不会被覆盖完(不等于0),var2太大就会影响var1(值不一定),如果编译的时候加了优化选项(gcc -O),作为速度优化,编译器会把变量按机器字对齐,也没有这种效果,总之,缓冲区溢出这种东西很麻烦,搞不清结果会是什么。

佩服佩服。。。。。
回复 支持 反对

使用道具 举报

发表于 2006-10-29 23:09:47 | 显示全部楼层
我倒是觉得这种题目可以出做招聘用的。
但是考的是有没有人会提出这个程序的问题。
真正有C语言编程经验的人是不会写出这种代码的,但是只有C语言考试经验的人会常常写出这种代码。
还有就是C语言不是一个太高级的语言,这个语言本身不会避免问题。只有程序员来避免问题。
缓冲区溢出是一个C程序员写代码时一直应该注意的问题,每次赋值都要考虑这个问题,不然由于这种运行状态产生的BUG是极其难找的。
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表