作者:薛定谔的coding猫

来源:C语言与程序设计

各位,今天给大家搜集了10道比较好的面试题,涉及了指针、运算、结构体、函数、内存,应该来说比较全面了,有兴趣的做一下检测一下自己的水平吧!

1.strcpy()函数

问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗?

#include<stdio.h>
int main(int argc, char *argv[])
{
int flag = 0;
char passwd[10];
memset(passwd,0,sizeof(passwd));
strcpy(passwd, argv[1]);
if(0 == strcmp("LinuxGeek", passwd))
{         flag = 1;
}
if(flag)
printf("\n Password cracked \n");
else
printf("\n Incorrect passwd \n");return 0; }

答:这道题前面专门有一篇推送写过,有的人可能没看,今天再讲一遍。破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。

虽然上面的密码并不正确,但我们仍然可以通过缓存溢出绕开密码安全保护。要避免这样的问题,建议使用 strncpy()函数。但一些编译器会在内部检测栈溢出的可能,所以这样往栈里存储变量很难出现栈溢出。比如gcc中就要使用编译命令‘-fno-stack-protector’来实现上述方案。

2.main()的返回类型

问:下面的代码能 编译通过吗?如果能,它有什么潜在的问题吗?

#include<stdio.h>void main(void){    char *ptr = (char*)malloc(10);if(NULL == ptr)    {printf("\n Malloc failed \n");return;    }else    {// Do some processingfree(ptr);    }return;}

答:这道题是我一直想给大家说的,因为main()方法的返回类型,这段代码的错误在大多数编译器里会被当作警告。main()的返回类型应该是“int”而不是“void”,好多人都习惯写成void,因为“int”返回类型会让程序返回状态值。这点非常重要,特别当程序是作为依赖于程序成功运行的脚本的一部分运行时,所以强烈建议大家以后要写int。

3.内存泄露

问:下面的代码会导致内存泄漏吗?

#include<stdio.h> void main(void){ char *ptr = (char*)malloc(10);
if(NULL == ptr)     { printf("\n Malloc failed \n"); return;     } else    { // Do some processing     } return; }

答:尽管上面的代码并没有释放分配给“ptr”的内存,但并不会在程序退出后导致内存泄漏。在程序结束后,所有这个程序分配的内存都会自动被处理掉。但如果上面的代码处于一个“while循环”中,那将会导致严重的内存泄漏问题!

4.free()函数

问:下面的程序会在用户输入’freeze’的时候出问题,而’zebra’则不会,为什么?

#include<stdio.h> int main(int argc, char *argv[]){ char *ptr = (char*)malloc(10);
if(NULL == ptr)     {         printf("\n Malloc failed \n"); return -1;     } else if(argc == 1)     {         printf("\n Usage  \n");     } else    {         memset(ptr, 0, 10);strncpy(ptr, argv[1], 9);
while(*ptr != 'z')         { if(*ptr == '') break; else                ptr++;         }
if(*ptr == 'z')         {             printf("\n String contains 'z'\n"); // Do some more processing         }free(ptr);     } return 0; }

答:这里的问题在于,代码会(通过增加“ptr”)修改while循环里“ptr”存储的地址。当输入“zebra”时,while循环会在执行前被终止,因此传给free()的变量就是传给malloc()的地址。但在“freeze”时,“ptr”存储的地址会在while循环里被修改,因此导致传给free()的地址出错,也就导致了seg-fault或者崩溃。

5.使用_exit退出

问:在下面的代码中,atexit()并没有被调用,为什么?

#include<stdio.h> void func(void){ printf("\n Cleanup function called \n"); return; }
int main(void){ int i = 0;atexit(func);
for(;i<0xffffff;i++);_exit(0); }

答:这是因为_exit()函数的使用,该函数并没有调用atexit()等函数清理。如果使用atexit()就应当使用exit()或者“return”与之相配合。

6.void*和C结构体

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

答:如下:

int func(void *ptr)

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

7.*和++操作

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

#include<stdio.h> int main(void){ char *ptr = "Linux"; printf("\n [%c] \n",*ptr++); printf("\n [%c] \n",*ptr);
return 0; }

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

[L][i]

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

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

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

#include<stdio.h>
int main(void){ char *ptr = "Linux";     *ptr = 'T';
printf("\n [%s] \n", ptr);
return 0; }

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

9.返回本地变量的地址

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

#include<stdio.h> int* inc(int val){ int a = val;   a++; return &a; }
int main(void){ int a = 10; int *val = inc(a); printf("\n Incremented value is equal to [%d] \n", *val);
return 0; }

答:尽管上面的程序有时候能够正常运行,但是在“inc()”中存在严重的漏洞。这个函数返回本地变量的地址。

因为本地变量的生命周期就是“inc()”的生命周期,所以在inc结束后,使用本地变量会发生不好的结果。这可以通过将main()中变量“a”的地址来避免,这样以后还可以修改这个地址存储的值。

10.处理printf()的参数

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

#include<stdio.h>
int main(void){ int a = 10, b = 20, c = 30; printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2));
return 0; }

答:输出结果是:

110..40..60

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

欢迎评论区留言讨论,感谢耐心阅读!

-END-

﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌

免责声明:本文转自网络,版权归原作者所有,如涉及作品版权问题,请及时与我们联系,谢谢!

往期好文合集

学C/C++语言,32个必备修养!<<戳这里

用覆铜板雕个女朋友。<<戳这里

学嵌入式有两个诀窍:勤奋刻苦+不要脸。<<戳这里

最 后

若觉得文章不错,转发分享,也是我们继续更新的动力。

5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等

在公众号内回复「更多资源」,即可免费获取,期待你的关注~

长按识别图中二维码关注

测试你C语言水平的十道题,挑战一下?相关推荐

  1. 线性判别用于提取词向量_资源 | 你是合格的数据科学家吗?30道题测试你的NLP水平...

    原标题:资源 | 你是合格的数据科学家吗?30道题测试你的NLP水平 选自Analyticsvidhya 作者:Shivam Bansal 机器之心编译 参与:黄小天.李亚洲.Smith 近日,ana ...

  2. a上面一个圈在c语言是什么,传说中科目一最难的十道题,你都会做吗?

    2016-10-27 14:44:06 科目一属于理论知识考试,考试难度并不大.为了帮助学员查漏补缺,元贝小编整理了科目一考试中最易出错的十道题,赶紧看看你会不会做吧!. 1.路中两条双黄色虚线是什么 ...

  3. java实现加减乘除运算符随机生成十道题并判断对错_2020年Java面试题(3年的工作总结),最全的知识点总结...

    这份Java面试题整整花了三个月的时间来整理,都是自己再工作中总结出来,记住多少就写多少,希望这份资料可以帮助你们,文末有其余部分资料的领取方式. Redis12道面试题 1.什么是Redis? 答: ...

  4. 嵌入式系统Linux内核开发工程师必须掌握的三十道题

    嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...

  5. 计算机普通话测试教程说话,普通话水平测试说话题答题技巧

    普通话水平测试说话题答题技巧 说话是四项测试内容中难度最大的一项.对于母语是方言的应试人来说,说话时既要表达流畅,又要语音标准,的确不易.下面是小编与大家分享的普通话水平测试说话题答题技巧,欢迎阅读学 ...

  6. 【校招VIP】数据库基础之sql五十道题

    考点介绍: 数据库在测试工程师的面试过程中也是常问的一项.面试有一定的层次性,如bat级别公司每个点都会深入,而有些公司则只会问到表层,所以每个领域都分为必须掌握和深入了解这两个部分. 本期分享的数据 ...

  7. go设置后端启动_Go语言基础(十四)

    Go语言基础(十四) 一.Redis 二.NSQ 三.Go module 四.Context......0 一.Redis Redis是一个key-value存储系统.和Memcached类似,它支持 ...

  8. 汉字应用水平测试软件,汉字应用水平测试(HZC)试点将在11个省市进行

    汉字是记录汉语的书面符号系统,汉字的认读.选用.辨误.书写能力,是衡量.考查汉字应用能力的几个主要方面.教师.文秘.编辑.记者.广告牌匾制作等职业从业人员应该具备一定水平的汉字应用能力,对他们的汉字应 ...

  9. 英语语言水平C级,国际通用的学生英语能力水平评测标准

    教育家陶行知: "育人和种花一样,需要先认识花木特点,再区别不同情况,给予施肥浇水和培养教育." 英语学习的过程中,有的英语学习者会很迷惑,究竟自己在什么水平,什么样的水平需要什么 ...

最新文章

  1. 嵌入式linux支持python,【python】嵌入式设备上python的使用
  2. C++:MSVCRTD.lib(crtexe.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStart...
  3. 云计算革命对国际关系的影响
  4. python 类属性及限制
  5. Resource is out of sync with the file system解决办法
  6. JAVA utf8编码字符_Java中的UTF-8字符编码
  7. ***必学的DOS命令
  8. Linux dstat 监控工具
  9. 常用工具软件的交叉编译
  10. 智能科学与技术是不是属于计算机专业,智能科学与技术专业属于什么类别
  11. node 拦截器拦截请求下载电子书以及等待前端渲染操作、浏览器操作
  12. 人生有多少次可以改命的机会,你把握住了几次,卷了几次(闲扯版)
  13. 刀剑乱舞极化图片_【刀剑乱舞】极化刀速查攻略
  14. JDK17的下载安装与配置(详细教程)
  15. t568a/t568b的线序
  16. SKEY协议设计实验
  17. 【水声通信】使用Bellohop模型产生水声信道,采用相干检测的方法进行PSK、QAM调制解调【matlab源码】
  18. 深圳市深汕特别合作区支持产业发展若干措施(征求意见稿)
  19. 基于OpenCV的人脸识别考勤系统(一)
  20. MPI并行计算学习笔记6——行主元高斯消去法

热门文章

  1. Cannot add product to Opportunity in Fiori - RFC error
  2. SAP UI5 Fiori startup service
  3. SAP CRM Product workflow debug
  4. SalesArea F4 help implementation
  5. nodejs应用错误消息PayloadTooLarge的处理
  6. How to find CRM system's integrated ERP system
  7. wordpress里mySql服务器的配置
  8. pricing data of Service order is copied from BP master data
  9. se16 and include table entries into TR SAT trace - Gross time and Net time
  10. 如何处理object family XXX is not intended for installed base category issue