LinuxSir.cn,穿越时空的Linuxsir!

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

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

[复制链接]
发表于 2004-11-27 09:03:11 | 显示全部楼层

自卑中

各位的研究深度让小弟感触颇深,看来我们要做的还有很多!
发表于 2004-11-27 11:44:23 | 显示全部楼层
我觉得这个题目意义不大。因为这不是一个好的程序员会写出来的代码。同意在编译的时候打开必要的warning,这样的程序编译不会通过的。这个题目要考察什么能力呢?有没有注意到数据类型不同?还是有没有遇到过这样的例子。
发表于 2004-11-27 12:55:45 | 显示全部楼层
这个问题都讨论了一年半了,哈哈!
这个问题还有一个漏洞,就是编译器如何在栈中分配内存的。
要得到预想的答案,那么编译器在栈中分配内存时必须按照
定义变量的顺序从高地址到低地址依次分配,但是这并不是
标准啊!
我用vc和cygwin分别做了一个实验,考察var*的地址
第一次用楼主的代码,
  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,"%d",&var2);
  11. sscanf(str_val3,"%d",&var3);
  12. printf("var1=%d,var2=%d,var3=%d\n",var1,var2,var3);
  13. }
复制代码
gcc输出
  1. var1 2289588
  2. var2 2289587
  3. var3 2289580
复制代码

vc输出
  1. var1 1245044
  2. var2 1245043
  3. var3 1245036
复制代码
这样看题目没问题,但是在增加一个变量var4试试
  1. int main()
  2. {
  3.         int var1=0;
  4.         char var2=0;
  5.         int var3=0;
  6.         char var4=0;
  7.         printf("var1 %d\nvar2 %d\nvar3 %d\nvar4 %d\n",&var1,&var2,&var3,&var4);
  8. }
复制代码
gcc
  1. var1 2289588
  2. var2 2289587
  3. var3 2289580
  4. var4 2289579
复制代码
可见gcc时按定义顺序依次分配空间
vc
  1. var1 1245044
  2. var2 1245043
  3. var3 1245036
  4. var4 1245051
复制代码
看看var4的地址,显然vc并非按顺序分配。
以上gcc和vc都没有打开任何优化选项
发表于 2004-11-27 17:15:06 | 显示全部楼层
最初由 yangtou 发表
这个问题都讨论了一年半了,哈哈!
这个问题还有一个漏洞,就是编译器如何在栈中分配内存的。
要得到预想的答案,那么编译器在栈中分配内存时必须按照
定义变量的顺序从高地址到低地址依次分配,但是这并不是
标准啊!
。。。
看看var4的地址,显然vc并非按顺序分配。这

不会吧。如果是这样,用struct定义的文件格式,如IP包头部等等,就不能用啦。
发表于 2004-11-27 18:07:19 | 显示全部楼层
在struct中成员的内存分配是按照声明顺序进行的,但是这和编译器在栈中为变量分配内存不一样啊。
发表于 2004-11-27 19:49:54 | 显示全部楼层
我还是觉得不太可能。不过我有用VC,有条件的兄弟多试验一下吧,看看是不是这样。
发表于 2004-11-27 20:36:09 | 显示全部楼层
忘记说了,我原来用的是vc2005,没说清楚
发表于 2004-11-27 20:43:04 | 显示全部楼层
我又用vc6做了实验
  1. int main()
  2. {
  3.         int         i = 1;
  4.         int         j = 2;
  5.         char        k = 3;
  6.         char        l = 4;
  7.         int        m = 5;
  8.         char        n = 6;
  9.         int        o = 7;
  10.         char        p = 8;
  11.         char        q = 9;
  12.         char        r = 10;
  13.         printf("i %d\nj %d\nk %d\nl %d\nm %d\nn %d\no %d\np %d\nq %d\nr %d\n",
  14.                 &i,&j,&k,&l,&m,&n,&o,&p,&q,&r);
  15.         return 0;
  16. }
复制代码

输出
  1. i 1245040
  2. j 1245036
  3. k 1245032
  4. l 1245028
  5. m 1245024
  6. n 1245020
  7. o 1245016
  8. p 1245052
  9. q 1245048
  10. r 1245044
复制代码


gcc
  1. i 2289588
  2. j 2289584
  3. k 2289583
  4. l 2289582
  5. m 2289576
  6. n 2289575
  7. o 2289568
  8. p 2289567
  9. q 2289566
  10. r 2289565
复制代码

vc2005
  1. i 1245044
  2. j 1245028
  3. k 1245042
  4. l 1245041
  5. m 1245032
  6. n 1245050
  7. o 1245036
  8. p 1245051
  9. q 1245043
  10. r 1245040
复制代码
发表于 2004-11-27 20:45:36 | 显示全部楼层
vc6也不是按照从高到的顺序分配内存的

从上面的结果还可以看出vc2005和vc6的变量对齐也不一样
发表于 2004-11-28 16:46:51 | 显示全部楼层
compile result I got for this program is
24,32,48 under win xp using VC++ 6.0

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

本版积分规则

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