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

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

51Testing软件测试网W C"P8R)Orx5RH/q^!T,~

  7、void*和C结构体51Testing软件测试网 } NP-s:hRB`w

51Testing软件测试网 E.g\*T.j6w|Q kT

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

/Rh2w6kfh p0

H+XAU PYgn"o0  答:如下:51Testing软件测试网m_4@1\7fO XN1h

51Testing软件测试网8wm-vO,Y

51Testing软件测试网 uLq v6h(}

int func(void *ptr)

IS+J XM3n0  如果这个函数的参数超过一个,那么这个函数应该由一个结构体来调用,这个结构体可以由需要传递参数来填充。

h!D BJ/@2g`3Rjx0

px;? ["t"?0  8、*和++操作

_@2k4A\f$g051Testing软件测试网$?(v9j,Dz

  问:下面的操作会输出什么?为什么?

R\|'_+S"N}0

!VA6J NVA{0

6b oOS)a)bJ0
  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软件测试网X*~1Oo}t

  答:输出结果应该是这样:

xt4Mffj+mU051Testing软件测试网(bI%G Tot&H|D

K o&o MpH0
  1. [L]  
  2.  
  3. [i]

9vW$e;k/kLga#S0  因为“++”和“*”的优先权一样,所以“*ptr++”相当于“*(ptr++)”。即应该先执行ptr++,然后才是*ptr,所以操作结果是“L”。第二个结果是“i”。

TN[-X.f#|0

9RjrcI0Aew+lT0  9、问:修改代码片段(或者只读代码)51Testing软件测试网*n'zm(Y,r

51Testing软件测试网9UKd:Ah-k&E

  问:下面的代码段有错,你能指出来吗?51Testing软件测试网$fG3UU9Nd

L(K6x\~0

B(zI2WFvt+p6n5n0
  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. }

6Hf7j5a*TFQ.~ _UFC0  答:这是因为,通过*ptr = ‘T’,会改变内存中代码段(只读代码)“Linux”的第一个字母。这个操作是无效的,因此会造成seg-fault或者崩溃。51Testing软件测试网l;B;K[9H

M8Z:C)kr }0Q-L%RY0  10、会改变自己名字的进程51Testing软件测试网$~(g'Grc5H

O;rH k'M&g }\1F0  问:你能写出一个在运行时改变自己进程名的程序吗?51Testing软件测试网3HJl2P4bi)r-g

51Testing软件测试网_+T#h)A[2^(ES

  答:参见下面这段代码:51Testing软件测试网 E(R+lJB!p7Q3jx

51Testing软件测试网 So't Mxx

M-bj su0
  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. }

#}G7PG'h1s6R0  11、返回本地变量的地址

#u OH)^E1wAnN051Testing软件测试网 Ih,RJ}8{J*|

  问:下面代码有问题吗?如果有,该怎么修改?51Testing软件测试网LW7E i"x

&wq`u?8O051Testing软件测试网;{q7f9E F*X

  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. }

*iA6R$ze|a%RpnGVi0  答:尽管上面的程序有时候能够正常运行,但是在“inc()”中存在严重的漏洞。这个函数返回本地变量的地址。因为本地变量的生命周期就是 “inc()”的生命周期,所以在inc结束后,使用本地变量会发生不好的结果。这可以通过将main()中变量“a”的地址来避免,这样以后还可以修改 这个地址存储的值。51Testing软件测试网$i}^/W-im?

51Testing软件测试网(`+Hymy

  12、处理printf()的参数51Testing软件测试网.T~3] u9Z c7yNF

51Testing软件测试网,KG.H-E@/Z1}O4s

  问:下面代码会输出什么?51Testing软件测试网;TC%zk Gb#D r

3}or/OtQ0

v.s;Yh9W6V2d0
  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. }

fW2]&L(hU5v0  答:输出结果是:

_*r\w'?`{ }*T051Testing软件测试网\*[n;L"^o8@9X

51Testing软件测试网p#Tu*}(|b]#n

110..40..60

K6R9mjH,wef0  这是因为C语言里函数的参数默认是从右往左处理的,输出时是从左往右。

%`%H[gi E1@K3Ke0

TAG:

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

评分:0

我来说两句

Open Toolbar