【c语言面试题】c语言面试题

面试试题 2021-02-13 网络整理 可可

【jianli.jxxyjl.com--面试试题】

1.gets()函数

问:请找出下面代码里的问题:

#include<stdio.h> int main(void) {     char buff[10];     memset(buff,0,sizeof(buff));      gets(buff);      printf("\n the buffer entered is [%s]\n",buff);      return 0; } 

答:上面代码里的问题在于函数gets()的使用,这个函数从stdin接收一个字符串而不检查它所复制的缓存的容积,这可能会导致缓存溢出。这里推荐使用标准函数fgets()代替。

2.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验证位也变成了非零,也就可以获得被保护的数据了。例如:

$ ./psswd aaaaaaaaaaaaa  password cracked 

虽然上面的密码并不正确,但我们仍然可以通过缓存溢出绕开密码安全保护。

要避免这样的问题,建议使用 strncpy()函数。

作者注:最近的编译器会在内部检测栈溢出的可能,所以这样往栈里存储变量很难出现栈溢出。在我的gcc里默认就是这样,所以我不得不使用编译命令‘-fno-stack-protector’来实现上述方案。

3.main()的返回类型

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

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

答:因为main()方法的返回类型,这段代码的错误在大多数编译器里会被当作警告。main()的返回类型应该是“int”而不是“void”。因为“int”返回类型会让程序返回状态值。这点非常重要,特别当程序是作为依赖于程序成功运行的脚本的一部分运行时。

4.内存泄露

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

#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循环”中,那将会导致严重的内存泄漏问题!

提示:如果你想知道更多关于内存泄漏的知识和内存泄漏检测工具,可以来看看我们在valgrind上的文章。

5.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或者崩溃。

6.使用_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”与之相配合。

7. 写一个“标准”宏min,这个宏输入两个参数并返回较小的一个。
#define min(a,b) ((a) <= (b) (a) : ))

这个测试是为下面的目的而设的:

1). 标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准c的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。 2). 三重条件操作符的知识。这个操作符存在c语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。 3). 懂得在宏中小心地把参数用括号括起来 4). 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事? least = min(*p++, b);

8. 嵌入式系统中经常要用到无限循环,你怎么样用c编写死循环呢?

这个问题用几个解决方案。我首选的方案是: while(1) { } 一些程序员更喜欢如下方案: for(;;) { } 这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的 基本原理。如果他们的基本答案是:“我被教着这样做,但从没有想到过为什么。”这会给我留下一个坏印象。 第三个方案是用 goto loop: ... goto loop; 应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的basic/fortran程序员。

9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。

对这个问题有三种基本的反应 1). 不知道如何下手。该被面者从没做过任何嵌入式系统的工作。 2). 用bit fields。bit fields是被扔到c语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到 infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。 3). 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下: #define bit3 (0x1<<3) static int a; void set_bit3(void) { a |= bit3; } void clear_bit3(void) { a &= ~bit3; } 一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。

10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ansi编译器。写代码去完成这一任务。

这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下: int *ptr; ptr = (int *)0x67a9; *ptr = 0xaa55;

一个较晦涩的方法是: *(int * const)(0x67a9) = 0xaa55;

即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。

本文来源:https://jianli.jxxyjl.com/mianshishiti/2669.html

  • [美国F1签证面试问题]美国f1签证面试问题

    美国f1签证面试技巧:回答问题的原则  (1)回答问题时用英语,语速可放慢。 如果太快,签证官认为您的英语很好,也因此会加快语速,这样您可能会听不懂。当然,官员有时故意提高说话的速度,来考核您的英语水平。您可以把语速压下来,讲得慢并不是说明英语差,语法要正确。  (2) 回答问题时要简明扼要,态...

    发布于:2021-05-20

    详细阅读
  • 腾讯面试题目答案_腾讯面试题

    请将答卷、作品及简历压缩后发送到:campus@tencent com 邮箱,投递作品请在主题标明:职位+地区+学校+姓名,如:用户研究+北京+北京大学+张三 一、 耐心填一填!(每空4分,共24分) 1 为div设置类a与b,应编写html代码_...

    发布于:2021-05-20

    详细阅读
  • 【应聘面试常见问题及回答技巧】面试问题及回答

    面试问题及回答参考  1、我们为什么要聘用你  (测试你的沉静与自信。)给一个简短、有礼貌的回答:“我能做好我要做的事情、“我相信自己,我想得到这份工作。  2、为什么你想到这里来工作  (这应该是你喜爱的题目。)因为你在此前进行了大量的准备,你了解这家公司。组织几个原因...

    发布于:2021-05-19

    详细阅读
  • 面试中可能被问到的问题英文_面试中可能被问到的问题

    面试中可能被问到的问题  面试随单位和岗位的不同而有很大差别,没有固定的形式、问题和答案,这里所列的只是常见的一些问题和回答的要点,仅供毕业生参考。  (一)关于个人方面的问题  1、请介绍一下你自己  在面试前用人单位大多都看过了毕业生的自荐材料,一些基本情况都有所了解,所以在自我介绍时要简...

    发布于:2021-05-19

    详细阅读
  • 护士应聘面试常见问题及回答|护士面试常见问题及答案

    护士面试常见问题及答案(一)  1、 我们为什么要雇请你呢?  有的面试只有这么一个问题。话虽简单,可是难度颇高。主要是测试你的沉静与自信。给一个简短、有礼貌的回答:我能做好我要做得事情,我相信自己,我想得到这份工作。根据自己的实际情况,好好想想把,看怎么说才具有最高说服力。  2、 你认为...

    发布于:2021-05-19

    详细阅读
  • 江南style小苹果_江南Style成面试题

    江南style成面试题;  18日上午,常州市第一中学的报告厅里坐满了老师和同学,现场的气氛紧张而热烈,这里正在进行XX届清华大学“新百年领军计划”推荐生选拔pk。5名候选人经过个人陈述、现场提问、一分钟总结等3个环节的比拼,最终高三(1)班的***胜出,成为清...

    发布于:2021-05-19

    详细阅读
  • 面试常用问题解析_届面试问题解析

    1、你认为你适合干什么?  一般一个人的选择是从想干什么和能干什么这两个方面着手考虑的,这两点都得到满足才是最佳选择。但现实中不可能都得到最大化的满足。  许多人只从表面上了解工作性质,甚至对自身的了解也流于表面,认为善于交流的人就适合做营销,沉稳的人只适合搞研究。其实,善于交流的人如果不能...

    发布于:2021-05-19

    详细阅读
  • 外贸公司面试题目_外贸公司面试题

    公务员面试总原则  面试时,考生应该坚持自信和沉着。答题时既要实事求是,也要随机应变。具体表现为,考生应该手脚安稳,不乱抖动,两眼平视主考官,注意和考官们的目光交流。面试并不是要像机器人一样表现“完美”,考生可偶尔低头看纸、思考,也可用手势。只要两眼不乱飘,自然地微笑,稳重、...

    发布于:2021-05-18

    详细阅读
  • 产品经理面试会问哪些问题_产品经理面试:哪些问题是你没有准备的?

    产品面试的同学提供一些帮助。  面试问题分为自我介绍、产品基本知识、实习经理和个人经历(共50题)。有些基本的问题,不管你去面试什么公司、什么行业都会问到。建议大家在准备面试之前,准备好你认为做可能问道的50个问题,然后把答案写好,打印出来。然后经常去看看,去修改。  往往你第二天,看昨天写的...

    发布于:2021-05-18

    详细阅读
  • 【车让人面试题】面试题:让你逃税100万,你该怎么做?

    如果您作为财务经理,如果总经理要求您1年之内逃税100万元,您会怎么做?  分析:面对这类问题,如果你抓耳搔腮地思考逃税计谋,或者思如泉涌地立即列举出一大堆方案,你都会中他们的圈套。实际上,主考官这个时候真正考核的不是你的业务能力,而是你的商业判断能力及商业道德方面的素养,因为在几乎所有的国际化...

    发布于:2021-05-18

    详细阅读

Copyright @ 2011-2019 求职简历网 All Rights Reserved. 版权所有

免责声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。

 站长统计