LinuxSir.cn,穿越时空的Linuxsir!

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

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

[复制链接]
发表于 2003-6-21 22:16:02 | 显示全部楼层
虽然我看的模模糊糊
但是这么专业,正经的技术讨论很难得啊
^_^
我顶一下
发表于 2003-6-23 01:50:24 | 显示全部楼层
程序要改正起来其实很简单:
  1. int main(void)
  2. {
  3. int var1=0;
  4. char var2=0;
  5. int var3=0;
  6. char str_val1[]="24\n";
  7. char str_val2[]="32\n";
  8. char str_val3[]="48\n";
  9. sscanf(str_val1,"%d",&var1);
  10. sscanf(str_val2,"%c",&var2); #把原来的%d改成%c
  11. sscanf(str_val3,"%d",&var3);
  12. printf("var1=%d,var2=%c,var3=%d\n",var1,var2,var3); #把原来的%d改成%c
  13. }
复制代码
 楼主| 发表于 2003-6-23 09:03:30 | 显示全部楼层
最初由 dreamrise 发表
程序要改正起来其实很简单:

  1. int main(void)
  2. {
  3. int var1=0;
  4. char var2=0;
  5. int var3=0;
  6. char str_val1[]="24\n";
  7. char str_val2[]="32\n";
  8. char str_val3[]="48\n";
  9. sscanf(str_val1,"%d",&var1);
  10. sscanf(str_val2,"%c",&var2); #把原来的%d改成%c
  11. sscanf(str_val3,"%d",&var3);
  12. printf("var1=%d,var2=%c,var3=%d\n",var1,var2,var3); #把原来的%d改成%c
  13. }
复制代码

这样输入var2=‘3’,程序本身的bug是修复了,但意思和原来的可能就不一样了。
其实这个问题可能引发的相关问题还是可以讨论的。
1。如果把char var2=0;放在第一句,程序有可能直接core,特别是这样的代码在一个子函数内实现。
2。大家在写程序的时候局部变量可能不会用到char来进行访问,但如果是内存中的大量结构struct (char var1;}是很有可能出现的,为了节省空间,有的人经常这么干。这样由此引发了很多潜在的bug,特别是基于内存操作和指针链表等实现某种算法的时候(比如hash表,很常用的)。别人写的数据结构可能非常稳定了,就像sscanf一样,但外围实现代码的人却很有可能犯这样的错误导致无法预料的结果。
3。还有很多......
发表于 2003-6-23 22:32:39 | 显示全部楼层
欢迎楼上的多谈点体会,好让弟兄们多长见识。
发表于 2003-6-23 22:57:01 | 显示全部楼层
最初由 libinary 发表
这个题不太好吧,不同的编译器可能有不同的结果,加上优化选项也可能有不同的结果,之所以有这样的结果是因为缓冲区溢出, sscanf(str_val2,"%d",&var2)中的var2是char,只占一个字节,当作为%d格式的时候实际写了4个字节,声明的时候var1在var2前面,所以就把var1覆盖了3个字节,这和机器堆栈的生长方向也有关,如果栈是向上生长的就没有这种效果,还和str_var的值有关,var1太大就不会被覆盖完(不等于0),var2太大就会影响var1(值不一定),如果编译的时候加了优化选项(gcc -O),作为速度优化,编译器会把变量按机器字对齐,也没有这种效果,总之,缓冲区溢出这种东西很麻烦,搞不清结果会是什么。


发表于 2003-7-4 12:47:05 | 显示全部楼层
我一看就知道出问题了,(我只学一学期C)

还有问题是,int 不一定是4字节,在vc 上long,int 都是8字节,这题目超差!!!!什么都是不确定的。
我遇到这种题的话就没办法了.

出成改bug题就好了.
发表于 2003-7-4 21:12:23 | 显示全部楼层
好热烈!
发表于 2003-7-4 21:32:02 | 显示全部楼层
最初由 lordbyorn 发表
我一看就知道出问题了,(我只学一学期C)

还有问题是,int 不一定是4字节,在vc 上long,int 都是8字节,这题目超差!!!!什么都是不确定的。
我遇到这种题的话就没办法了.

出成改bug题就好了.

你一定没有看清楚楼主的题目。楼主说的是C语言。在GCC上INT是4个字节。而且long int 和int根本就是两回事。
发表于 2003-7-4 22:51:07 | 显示全部楼层
最初由 0100 发表
你一定没有看清楚楼主的题目。楼主说的是C语言。在GCC上INT是4个字节。而且long int 和int根本就是两回事。


1、一定有 long int 吗??(至少在vc里没有,但我听说过,还没有标准化的)
2、int double long 等,长度是编译器决定的。
    int 在 gcc 里是4字节,在DJGPP里忘了(和gcc应该相同吧),在vc,bc里8字节。
3、没人说VC编译的一定是C++,C也可以。
发表于 2003-7-4 23:26:03 | 显示全部楼层
long int =long
short int =int

只是平时可以简写掉

另外在32位上LONG 和INT都是4 BYTE
可以使用SIZEOF试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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