很好玩的12个c语言面试题

点击蓝字

ec9e0f78e9806eb68700b81a9a6e8ba7.png

关注我们

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

来源于网络,侵删

12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个!

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.void*和C结构体

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

答:如下:

‍‍int func(void *ptr) ‍‍‍‍

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

8.*和++操作

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

#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”。

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

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

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

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

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

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

答:参见下面这段代码:

#include<stdio.h> int main(int argc, char *argv[]) 
{ int i = 0; char buff[100]; memset(buff,0,sizeof(buff)); strncpy(buff, argv[0], sizeof(buff)); memset(argv[0],0,strlen(buff)); strncpy(argv[0], "NewName", 7); // Simulate a wait. Check the process // name at this point. for(;i<0xffffffff;i++); return 0; 
}

11.返回本地变量的地址

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

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

12.处理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语言里函数的参数默认是从右往左处理的,输出时是从左往右。

d577236a9510a86ed27c5173f89a00f5.gif

如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

戳“阅读原文”我们一起进步

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

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

相关文章

java 开发 jvm_Java开发人员应了解的JVM流行语

java 开发 jvm本文将与您分享一些JVM“流行语”&#xff0c;它们对于Java开发人员在执行任何JVM性能和垃圾回收调优之前理解和记住非常重要。 本文末尾还提供了一些技巧&#xff0c;包括一些高级性能调优最佳实践。 将来的文章中将探讨有关Oracle HotSpot并发GC收集器&#xff…

C/C++在Java、Android和Objective-C三大平台下实现混合编程

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删Android和iOS开发都支持C开发&#xff0c;可以一套代码多平台使用。同时C难以反编译的特性也可以为Android开发带来代码的保密&#xff0c;另一n…

vs不一致的行尾对话框怎么调出_SolidWorks工程图打开后图纸没有了空白了怎么办?还能找回来吗?...

SolidWorks工程图打开后图纸没有了空白了怎么办&#xff1f;还能找回来吗&#xff1f;答案是肯定的。不知道大家使用SolidWorks有没有遇到这种情况&#xff0c;如下图所示&#xff1a;就是我们本来画好标注好的工程图&#xff0c;竟然没了&#xff0c;怎么造成的呢&#xff1f;…

jpa 忽略bean_在WildFly上将JPA和CDI Bean与骆驼一起使用

jpa 忽略bean我并没有真正为此计划&#xff0c;但是在一个免费的会议月份中&#xff0c;我有机会进行了一些深入的探讨&#xff0c;并向您展示了WildFly-Camel子系统提供的WildFly魔术上的更多Camel。 商业背景 该演示来自Christina Lin在JBoss Demo-Central上的一个演示 。 她…

【如何系统地学习 C++ 语言】关于C++,有哪些你需要提前知道的知识?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C是一种通用的、面向对象的编程语言&#xff0c;可用于开发操作系统、游戏、图形用户界面、后端以及高性能系统和应用程序。所以&#xff0c;尽管…

【如何系统地学习 C++ 语言】从开发环境到C++进阶,应该怎么办?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删开发环境如前面介绍的那样&#xff0c;C属于一种静态的编译型语言&#xff0c;所以&#xff0c;开发环境配置过程中就需要用到对应的编译器。C有…

高度可定制化的方案_如何开发高度可定制的产品

高度可定制化的方案您是否听说过&#xff1a;“我们非常喜欢您的产品……除了一些小细节。”&#xff1f; 然后&#xff0c;CIO推出了一系列其他“必备”要求的清单&#xff0c;其中有数百个要添加到您的惊人产品中。 您是否听说过&#xff0c;甚至说过&#xff1a;“团队&…

文言文编程?厉害了程序员!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删你能看出来&#xff0c;这首诗妙在哪里吗&#xff1f;来源&#xff1a;量子位&#xff08;ID&#xff1a;QbitAI&#xff09;&#xff0c;梦晨 萧…

sublime快捷键代码对齐_Python配置sublime运行环境

1、下载安装python和sublime&#xff0c;不再赘述&#xff0c;官网即可下载&#xff1b;2、打开subilme&#xff0c;打开Tools > Build System > New Build System..3、点击New Build System后&#xff0c;会生成一个空配置文件&#xff0c;在这个配置文件内覆盖配置信息…

C语言贪心算法

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删01基本概念贪心算法是指在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;…

C++最佳实践 | 可维护性

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C最佳实践:1. 工具2. 代码风格3. 安全性4. 可维护性&#xff08;本文&#xff09;5. 可移植性及多线程6. 性能7. 正确性和脚本可维护性避免使用编…

springboot启动自动关闭_App自动化测试用例格式和App的启动与关闭

【一】基本的用例格式这里使用unittest测试框架来编写用例。注&#xff1a;unittest可以提供用例的组织和管理、预期结果验证、批量化运行、产生测试报告等功能。新建一个calculator的python package&#xff0c;新建一个calculator_test.py&#xff0c;导入以下包。按照标准的…

C++最佳实践 | 可移植性及多线程

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C最佳实践:1. 工具2. 代码风格3. 安全性4. 可维护性5. 可移植性及多线程&#xff08;本文&#xff09;6. 性能7. 正确性和脚本可移植性明确使用的…

eap aka_使用API​​密钥(aka身份验证令牌)部署到Maven Central

eap aka如何在不使用未加密本地密码的情况下与Maven Central / Nexus通信&#xff08;尤其是使用Gradle&#xff0c;但不仅限于此&#xff09;。 基本原理 不幸的是&#xff0c;Gradle&#xff08;和许多其他构建工具&#xff09;没有提供任何机制来本地加密密码&#xff08;或…

万维网发布服务 w3svc 已停止 除非万维_万维网和互联网的区别

常见的一个误解是&#xff0c;人们认为互联网(Internet,也叫因特网)和万维网(World Wide Web)是同样的事物。一些词语如“互联网”、“万维网”&#xff0c;“网”和“网络”经常可以交替使用。但是&#xff0c;从技术的角度来说&#xff0c;“互联网”和“万维网”是两个独立的…

C/C++项目开发:通讯录管理系统源码,C语言链表实现

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删hello&#xff0c;各位小伙伴们大家好&#xff01;你们今天有敲代码嘛&#xff1f;如果有熟悉的小伙伴看到我&#xff0c;就知道又可以来学习源码…

javafx窗体程序_JavaFX真实世界应用程序:欧洲电视网广播联盟

javafx窗体程序我荣幸地与今年在德累斯顿Saxonia 系统公司工作的Alexander Casall一起在JavaOne上展示了多个JavaFX Real-World应用程序。 在准备本次演讲时&#xff0c;我们向客户和合作伙伴发送了一份调查表&#xff0c;并向他们询问了一些与他们的项目&#xff0c;他们的应用…

spring 数据库 链接db2_Druid,Java语言中最好的数据库连接池

Druid是Java语言中最好的数据库连接池&#xff0c;这话不是我说的&#xff0c;是Druid官方文档自己这样描述的&#xff0c;这是何等的自信&#xff01;连接池的作用&#xff0c;跟线程池的作用大同小异&#xff0c;都是为了减少频繁的创建销毁连接IO&#xff0c;提升性能。drui…

编程知识:既然已经有数组了,为什么还要链表?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删对于不少开发者而言&#xff0c;链表(linked list)这种数据结构既熟悉又陌生&#xff0c;熟悉是因为它确实是非常基础的数据结构&#xff0c;陌生…

jcache_随机JCache内容:多个提供程序和JMX Bean

jcacheJCache&#xff08;JSR 107&#xff09;是用于缓存的Java标准…足够了。 没有更多介绍性的东西。 这是一则速成文章&#xff0c;内容涉及 多个JCache提供程序配置&#xff0c;以及 功能&#xff1a;通过JMX Mbeans的JCache统计信息 管理多个JCache提供程序 如果您只使…