这几道 C/C 题涉及你的知识盲区?

8个C语言面试题,涉及指针、运算、函数、内存,看看你能做出几个!

1.gets()函数

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

#include 
int main(void)
{char buff[10];memset(buff, 0, sizeof(buff));gets(buff); //gets不检查输入的字符串大小,可能造成缓存溢出printf("\n The buffer entered is [%s]\n", buff);return 0;
}

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

2.strcpy()函数

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

#include 
#include
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("Password cracked \n"); } else { printf("Incorrect passwd \n"); } return 0; 
}

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

ubuntu@VM-16-5-ubuntu:~$ g   -o test test.c
ubuntu@VM-16-5-ubuntu:~$ ./test aaaaaaaaaa
Incorrect passwd

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

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

3.内存泄露

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

#include 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 
#include
#include
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 == '\0') 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  
#include 
#include 
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.问:修改代码片段(或者只读代码)

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

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

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

7.返回本地变量的地址

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

#include 
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” 的地址来避免,这样以后还可以修改这个地址存储的值。

8.处理printf()的参数

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

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

答:输出结果是:

110..40..60

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

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

a8985df142059d3482c73e6dd9c8fd67.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

logback redis_使用Spring Boot和Logback登录到Redis

logback redis在进行集中式日志记录时&#xff0c;例如使用Elasticsearch&#xff0c;Logstash和Kibana或Graylog2&#xff0c;您可以为Java应用程序提供多个选项。 您既可以编写标准的应用程序日志&#xff0c;也可以使用Logstash解析这些日志&#xff0c;这些日志既可以直接使…

荣耀6plus+android5.1,荣耀66Plus EMUI3.0开发版5.5.1版本发布说明

本帖最后由 秀姬 于 2015-6-8 11:22 编辑EMUI 3.0_Android4.4_5.5.1版本发布说明(开发版)适配机型&#xff1a;荣耀6 / 荣耀6 Plus 全系列机型下载地址&#xff1a;荣耀6标配版支持荣耀6手机全系列机型&#xff0c;不区分制式&#xff01;标配版支持L0X的各机型升级&#xff0c…

C 与 C 的真正区别在哪里?

C 与 C 的真正区别在哪里&#xff1f;C是中餐厨师的菜刀&#xff0c;做啥菜就那一把刀&#xff0c;切菜切肉切鱼&#xff0c;都是这一把刀&#xff0c;刀工好的师傅&#xff0c;豆腐都能切成一朵花。无论你提什么概念&#xff0c;都能用指针给你做出来&#xff0c;如果不行&…

byteman_Byteman –用于字节码操纵的瑞士军刀

byteman我正在与JBoss中的许多社区一起工作&#xff0c;有很多有趣的事情要谈论&#xff0c;以至于我无法将自己的每一分都缠住。 这就是为什么我非常感谢有机会不时地欢迎客座博客的主要原因。 今天是Jochen Mader&#xff0c;他是以代码为中心的书呆子群的一部分。 他目前花费…

html 怎么置顶表格,表格(Table)表头固定,内容上滚【5个实例】

当表格往上滚动的时候&#xff0c;表头固定不动&#xff0c;这样可以让用户时刻看清每一列的数据含义&#xff0c;这是人性化的设计&#xff0c;充分考虑了用户使用体验。本文将通过5个实例&#xff0c;来介绍这种表格设计。用户可通过下载源码&#xff0c;直接应用于自己的项目…

C语言变量的定义包括变量存储类型和变量的什么?

C语言变量的定义包括变量存储类型和变量的名称。C语言定义变量的格式&#xff1a;“数据类型 变量名;”&#xff0c;“数据类型”表示想要存储什么类型的数据&#xff0c;“变量名”就是你想给这个变量起个什么名字&#xff0c;通常都是用字母。变量的定义定义变量的格式非常简…

java 调用祖父方法_在Java中调用祖父母方法:您不能

java 调用祖父方法在文章保护的重点中&#xff0c;我详细介绍了“受保护”如何扩展“包私有”访问。 我在那儿写道&#xff1a; 你能做的是 覆盖子类中的方法或 使用关键字super调用parent方法。 通常&#xff0c;这实际上是您可以使用受保护的方法完成的所有操作。 &…

C语言代码注释必须用/**/ , 你没看错~

事情是这样的&#xff0c;有人离职&#xff0c;公司调我补缺。那个系统一直有个工程师在维护&#xff0c;参与该系统的新人来了又走&#xff0c;他始终泰然自若。刚过去一个礼拜&#xff0c;我就心下窃吼&#xff1a;“坑爹啊!”&#xff0c;也彻底体会到什么叫---绝对的权威、…

java8 streams_另一个Java 8 Lamdbas和Streams示例

java8 streams我一直落后于Java 8所关注的功能&#xff0c;因此在这篇文章中&#xff0c;我将简要介绍我对lambda和stream的初步经验。 和往常一样&#xff0c;我将专注于Podcast课程&#xff1a; package org.codingpedia.learning.java.core;import java.util.Comparator;p…

html文档的基本类型,HTML(网页的文档类型介绍)

一个html文件的第一行代码通常就是用于声明网页文档类型&#xff0c;其格式是:这一行不是属于标签文档类型:可以理解为不同的html版本&#xff01;html4.0 或4.01版本基本固定&#xff0c;但又有分化:严格性:了用的标签和属性相对较少&#xff0c;但能兼容更多的浏览器。宽松型…

C语言源代码展示:常用转换函数实现原理

编程时经常用到进制转换、字符转换。比如软件界面输入的数字字符串&#xff0c;如何将字符串处理成数字呢&#xff1f;和大家分享一下。01字符串转十六进制代码实现&#xff1a;void StrToHex(char *pbDest, char *pbSrc, int nLen) {char h1,h2;char s1,s2;int i;for (i0; i …

jax-rs jax-ws_在JAX-RS中处理异步请求中的超时

jax-rs jax-wsJAX-RS 2.0在客户端和服务器端都支持异步编程范例。 这篇文章重点介绍了使用JAX-RS&#xff08;2.0&#xff09;API在服务器端执行异步REST请求时的超时功能 无需过多介绍&#xff0c;这里是一个快速概述。 为了以异步方式执行方法&#xff0c;您只需 需要指定A…

html5 移动 优化,第四天:HTML5移动站优化技巧 摘自《10天学会移动站SEO》

现在大家基本上做手机网站都是做成HTML5的&#xff0c;因为现在智能手机等移动设备越来越多&#xff0c;几乎全部支持HTML5&#xff0c;那么给网站适配上HTML5的网站就很是必要了。以前的WML网站已经淘汰&#xff0c;而最新的方式就这种最好。我们这一节就重点讲一讲HTML5移动网…

c语言中switch的用法是什么?

c语言中switch的用法是&#xff1a;功能&#xff1a;switch语句是多分支选择语句.用来实现多分支选择结构.if语句只有两个分支可供选择,而实际问题中常常要用到多分支的选择.例如,学生成绩分类(90为"A"等,80-89分为B等,70-90分为C等......).当然这些都可以用嵌套的if…

简述垃圾对象产生_使用零垃圾创建数百万个对象

简述垃圾对象产生如性能优化第一规则中所述&#xff0c;垃圾是快速代码的敌人。 通过使用垃圾收集器的服务&#xff0c;它不仅会破坏任何确定性的性能&#xff0c;而且我们开始用垃圾填充CPU高速缓存&#xff0c;这将导致程序的高速缓存未命中。 那么&#xff0c;我们可以在不…

光学模拟 Android,基于Android平台的光学字符识别应用的设计与实现

摘要&#xff1a;随着数字化时代的蓬勃发展,信息量以指数级的速度增长,然而手工录入并存储信息的速度远不及信息的产生速度.光学字符识别(OCR)技术能够自动化地检测信息并识别出来,有效地解决了信息录入速度和正确率的问题.目前,基于PC设备的光学字符识别已经被广泛的应用于办公…

C语言“fread”函数的用法?

C语言“fread”函数的用法为“size_tf read(void *buffer,size_t size,size_t count,FILE *stream)”&#xff0c;其作用是从一个文件流中读数据&#xff0c;读取count个元素&#xff0c;每个元素size字节。示例1#include #include #include int main(){ FILE *stream; c…

html怎么设置数据条的颜色,jQuery EasyUI 数据网格 – 条件设置行背景颜色 | 菜鸟教程...

jQuery EasyUI 数据网格 - 条件设置行背景颜色本教程将向您展示如何根据一些条件改变数据网格(datagrid)组件的行样式。当 listprice 值大于 50 时&#xff0c;我们将为该行设置不同的颜色。数据网格(datagrid)的 rowStyler 函数的设计目的是允许您自定义行样式。以下代码展示如…

C语言中for语句的执行过程是什么?

C语言中for语句的执行过程是&#xff1a;for语句的一般形式为&#xff1a;for&#xff08;单次表达式;条件表达式;末尾循环体&#xff09;{中间循环体&#xff1b;}。for循环执行时&#xff0c;会先判断条件表达式是否成立&#xff0c;如果条件成立则执行中间循环体&#xff0c…

解耦,未解耦的区别_幂等与时间解耦之旅

解耦,未解耦的区别HTTP中的幂等性意味着相同的请求可以执行多次&#xff0c;效果与仅执行一次一样。 如果用新资源替换某个资源的当前状态&#xff0c;则无论您执行多少次&#xff0c;最终状态都将与您仅执行一次相同。 举一个更具体的例子&#xff1a;删除用户是幂等的&#x…