12个有趣的C语言面试题-2

上一篇 / 下一篇  2012-09-10 09:31:26 / 个人分类:C++

51Testing软件测试网f?O0J Lz

  7、void*和C结构体51Testing软件测试网&]zTX#]V ?f

51Testing软件测试网'c8Xr Ik)o r

  问:你能设计一个能接受任何类型的参数并返回interger(整数)结果的函数吗?

"P)aQD.@051Testing软件测试网uO-vFTr H1VKl_

  答:如下:51Testing软件测试网 X!S7n:UvN%D$A

k Iwr4V \9Z0

Z wm's4c){a"TD|0
int func(void *ptr)
51Testing软件测试网n9cy{NC;DF

  如果这个函数的参数超过一个,那么这个函数应该由一个结构体来调用,这个结构体可以由需要传递参数来填充。51Testing软件测试网5qk"S(v@$Y5}V!o

51Testing软件测试网DS_/]F_.G,Y^N^ \

  8、*和++操作

2DY)T2K6e$zD0

,frjyH.L0  问:下面的操作会输出什么?为什么?

E-RnJ-v5K0

fBrV R051Testing软件测试网W qt(i%`:n8v:u&i;N

  1. #include<stdio.h> 
  2.  
  3. int main(void
  4.     char *ptr = "Linux"
  5.     printf("\n [%c] \n",*ptr++); 
  6.     printf("\n [%c] \n",*ptr); 
  7.  
  8.     return 0; 
  9. }
51Testing软件测试网#w,](I6o~:|W

  答:输出结果应该是这样:51Testing软件测试网 M;KuOoB t6P`

51Testing软件测试网-C5VU)V%D

51Testing软件测试网Oc-yA6PY8jN(H4YC

  1. [L]  
  2.  
  3. [i]

"`V6q2V*}Y(?XL0  因为“++”和“*”的优先权一样,所以“*ptr++”相当于“*(ptr++)”。即应该先执行ptr++,然后才是*ptr,所以操作结果是“L”。第二个结果是“i”。51Testing软件测试网"[n6r.{ N+j

51Testing软件测试网)j.U w)J:p!WF^ N5s

  9、问:修改代码片段(或者只读代码)

3t[LWq'C5B$U0

|`n Htdv9HS0  问:下面的代码段有错,你能指出来吗?

+~'w V8}2Mg/?R6[0

-\/EqI'] J.l0~G051Testing软件测试网 B?_K%fy+S_:n

  1. #include<stdio.h> 
  2.  
  3. int main(void
  4.     char *ptr = "Linux"
  5.     *ptr = 'T'
  6.  
  7.     printf("\n [%s] \n", ptr); 
  8.  
  9.     return 0; 
  10. }
51Testing软件测试网S5H8QM eL,_7TQN(I

  答:这是因为,通过*ptr = ‘T’,会改变内存中代码段(只读代码)“Linux”的第一个字母。这个操作是无效的,因此会造成seg-fault或者崩溃。

T8w W'W#V+[(M/z0

*V7@]%Kz~F!g){0  10、会改变自己名字的进程51Testing软件测试网a2A1fk:o(t

vhztu,D0Z0  问:你能写出一个在运行时改变自己进程名的程序吗?51Testing软件测试网8}u*]rQ1]1c'om

~ U | nKHC0  答:参见下面这段代码:

V5BF%W7]F'r;qR0

(R0k`n/|+V0

5\7`q k3[0
  1. #include<stdio.h> 
  2.  
  3. int main(int argc, char *argv[]) 
  4.     int i = 0; 
  5.     char buff[100]; 
  6.  
  7.     memset(buff,0,sizeof(buff)); 
  8.  
  9.     strncpy(buff, argv[0], sizeof(buff)); 
  10.     memset(argv[0],0,strlen(buff)); 
  11.  
  12.     strncpy(argv[0], "NewName", 7); 
  13.  
  14.     // Simulate a wait. Check the process 
  15.     // name at this point. 
  16.     for(;i<0xffffffff;i++); 
  17.  
  18.     return 0; 
  19. }

q*u1Z Yf { u XR0  11、返回本地变量的地址

1mIbu+V0

T8R4b6PAZ e0  问:下面代码有问题吗?如果有,该怎么修改?51Testing软件测试网1`L9~1pko6f

51Testing软件测试网[$tbd`D

51Testing软件测试网PPPG6lA-cv#G

  1. #include<stdio.h> 
  2.  
  3. int* inc(int val) 
  4.   int a = val; 
  5.   a++; 
  6.   return &a; 
  7.  
  8. int main(void
  9.     int a = 10; 
  10.     int *val = inc(a); 
  11.     printf("\n Incremented value is equal to [%d] \n", *val); 
  12.  
  13.     return 0; 
  14. }

,b(aV[p:~'S:k6EC0  答:尽管上面的程序有时候能够正常运行,但是在“inc()”中存在严重的漏洞。这个函数返回本地变量的地址。因为本地变量的生命周期就是 “inc()”的生命周期,所以在inc结束后,使用本地变量会发生不好的结果。这可以通过将main()中变量“a”的地址来避免,这样以后还可以修改 这个地址存储的值。

A!AzN;hFyUf7d"d0

)PQ;G3URq!J0  12、处理printf()的参数51Testing软件测试网5|1m3])WG@d

3xl%Zv!g0V0  问:下面代码会输出什么?

,GUIvRS5h0

[SMvel`5X^051Testing软件测试网Xr?-s8S]0?

  1. #include<stdio.h> 
  2.  
  3. int main(void
  4.     int a = 10, b = 20, c = 30; 
  5.     printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2)); 
  6.  
  7.     return 0; 
  8. }
51Testing软件测试网fGn3[ m?V"tc

  答:输出结果是:

y d1Oe@Xt051Testing软件测试网5Q%Nrv#J${^G7z4h

51Testing软件测试网 t7b,_ r/ET.Q

110..40..60
51Testing软件测试网*Gq shy`4cF

  这是因为C语言里函数的参数默认是从右往左处理的,输出时是从左往右。51Testing软件测试网%pQ6PLU8r2N2c o


TAG:

xiaoshi_2011的个人空间 引用 删除 xiaoshi_2011   /   2012-09-10 14:43:24
3
 

评分:0

我来说两句

Open Toolbar