12个C语言面试题part2

本文精选12道C语言面试题,涵盖指针、进程、运算等核心知识点,并详细解析了每道题目的正确答案及背后的原理。通过这些题目,读者可以加深对C语言的理解,提高解决实际问题的能力。
摘要:12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个!

7.void*和C结构体

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

答:如下:

  
  1. int func(void *ptr) 

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

8.*和++操作

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

  
  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; 

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

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

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

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

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

  
  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; 

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

10.会改变自己名字的进程

问:你能写出一个在运行时改变自己进程名的程序吗?

答:参见下面这段代码:

  
  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; 

11.返回本地变量的地址

问:下面代码有问题吗?如果有,该怎么修改?

  
  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; 

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

12.处理printf()的参数

问:下面代码会输出什么?

  
  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; 

答:输出结果是:

  
  1. 110..40..60 

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

原文链接:the Geek Stuff

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值