版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C工程师面试题及详细答案(实战版)一、C语言基础语法面试题1、简述static关键字的三个作用参考答案:static是C语言核心关键字,主要有三个实战作用,区分变量和函数场景:第一,修饰局部变量。普通局部变量存储在栈区,函数执行结束后会销毁;被static修饰的局部变量会存储在静态全局区,程序运行期间始终保留,只会初始化一次,下次调用函数会沿用上次的值。第二,修饰全局变量。普通全局变量作用域是整个工程,可跨文件引用;static修饰的全局变量,作用域仅限当前源文件,其他文件无法访问,能有效避免全局变量命名冲突。第三,修饰函数。普通函数可以被工程内所有文件调用;static修饰的函数为内部函数,仅能在当前.c文件中调用,隐藏模块内部接口,提升代码安全性。2、const关键字的常用用法及意义参考答案:const的核心作用是只读修饰,防止数据被误修改,提升代码健壮性,四种常用场景:1、修饰普通变量:constinta=10;变量a的值不可修改,只读状态。2、修饰指针变量:constint*p;指针指向的数据不可改,但指针本身地址可以改;int*constp;指针本身地址不可改,但指向的数据可以修改。3、修饰指针和数据:constint*constp;指针地址和指向的数据均不可修改。4、修饰函数形参:voidfun(constchar*str);防止函数内部意外修改传入的实参数据,常用于字符串、数组传参。3、#define和const的区别参考答案:1、处理阶段不同:#define是预处理指令,预编译阶段直接文本替换,无类型检查;const是变量修饰符,编译阶段处理,有严格的数据类型校验。2、内存占用不同:#define宏定义不占用内存,仅做文本替换;const常量会在内存中分配空间(只读数据段)。3、作用域不同:#define作用域从定义处到文件末尾,可通过#undef取消;const变量作用域遵循变量规则,局部const仅函数内有效,全局const仅限当前文件。4、调试性不同:宏定义无法调试,替换后无符号信息;const常量可正常断点调试。二、指针与内存管理(高频核心)1、指针、数组名、&数组名的区别参考答案:以intarr[10]为例:1、arr(数组名):代表数组首元素的地址,等价于&arr[0],属于指针常量,指向首元素,arr+1跳过一个int字节(4字节)。数组名在sizeof、&操作中代表整个数组,其余场景均为首元素地址。2、&arr:代表整个数组的地址,地址数值和arr一致,但步长不同,&arr+1跳过整个数组的总字节数(40字节)。简单总结:地址数值相同,运算步长不同,数据类型不同。2、野指针是什么?如何避免野指针?参考答案:野指针是指向未知、非法内存地址的指针,没有合法的内存指向,不是空指针。空指针是明确指向0地址,野指针是地址随机。野指针产生原因:局部指针变量未初始化、指针指向的内存被释放后未置空、指针越界访问。避免方法:1、指针定义时直接初始化为NULL;2、动态内存释放后,立即将指针置为NULL;3、使用指针前做非空判断(if(p!=NULL));4、严格控制指针访问范围,避免数组、内存越界。3、malloc、calloc、realloc的区别参考答案:三者均为堆区动态内存分配函数,核心区别在初始化和扩容逻辑:1、malloc:只分配指定大小内存,不做初始化,内存中是随机垃圾值,参数为单个内存总字节数。2、calloc:分配n个大小为size的内存,分配后自动清零,无垃圾数据,参数为元素个数+单个元素字节数,适合需要初始化为0的场景。3、realloc:对已分配的堆内存进行扩容或缩容,可基于原有内存调整大小。扩容时若原内存后方空间充足,直接扩容;空间不足则重新开辟新内存,拷贝旧数据,释放旧内存。参数为原指针和新内存大小。注意:动态分配的内存必须手动free释放,否则会造成内存泄漏。4、栈、堆、全局区的区别参考答案:1、栈区:由系统自动分配、自动释放,存放局部变量、函数参数、返回地址。空间小、速度快,栈空间固定,过大局部变量会导致栈溢出。2、堆区:由开发者手动malloc/calloc/realloc分配、手动free释放,空间大、灵活,生命周期由开发者控制,使用不当会出现内存泄漏、野指针问题。3、全局区(静态区):存放全局变量、static静态变量,程序启动分配、程序结束释放,全程常驻内存。其中初始化的全局变量和未初始化的全局变量分属不同子区域。三、函数与结构体、枚举、联合体1、形参和实参的区别,值传递和地址传递的差异参考答案:实参是调用函数时传入的真实数据,可以是常量、变量、表达式;形参是函数定义时括号内的参数,仅在函数内部生效,是实参的临时副本。值传递:传递的是变量的值副本,函数内部修改形参,不会影响外部实参,适合只读传参,无法修改原数据。地址传递:传递的是变量的内存地址,函数内部通过地址直接操作原变量内存,修改形参会直接修改外部实参,适合修改原数据、减少大数据拷贝开销。2、结构体struct和联合体union的区别参考答案:1、内存存储方式不同:结构体成员变量独立占用内存,互不干扰,总大小遵循内存对齐规则;联合体所有成员共用同一块内存,同一时间只能存储一个成员数据,修改一个成员会覆盖其他成员。2、内存大小不同:结构体大小大于等于所有成员大小之和;联合体大小等于其最大成员的字节大小。3、使用场景不同:结构体用于存储一组不同类型、同时有效的数据;联合体用于节省内存,或对同一内存数据做类型转换(协议解析、硬件寄存器读取常用)。3、结构体内存对齐规则参考答案:1、每个成员的偏移地址,必须是自身大小的整数倍,不足则填充空字节;2、结构体的总大小,必须是结构体中最大基本数据类型成员大小的整数倍,不足末尾补空字节;3、可通过#pragmapack(n)修改对齐数,嵌入式开发中常用1字节对齐节省空间。举例:structA{chara;intb;};char占1字节,偏移0;int占4字节,需偏移4,中间填充3字节,总大小8字节。四、编译链接与程序运行原理1、C程序从源码到可执行文件的四个步骤参考答案:1、预处理:处理#开头的指令,宏替换、头文件展开、删除注释、条件编译,生成.i文件。2、编译:语法检查、语义分析,将预处理后的代码翻译成汇编代码,生成.s汇编文件。此阶段会报语法错误。3、汇编:将汇编指令翻译成机器码,生成.o目标文件(二进制文件,不可执行)。4、链接:合并多个目标文件、库文件,解析符号引用,分配虚拟地址,生成可执行文件。未定义函数、重复定义问题均在链接阶段报错。2、头文件重复包含的问题及解决方法参考答案:多个源文件同时包含同一个头文件,会导致函数、结构体、宏重复定义,编译报错。两种标准解决方式:1、条件编译防护(通用、跨平台):#ifndef__HEAD_H__#define__HEAD_H__//头文件内容#endif2、#pragmaonce(编译器支持,简洁),放在头文件开头即可。五、高频易错编程题(带解析)1、写出字符串长度计算函数(不使用strlen)参考答案:c
unsignedintmy_strlen(constchar*str)
{
unsignedintlen=0;
if(str==NULL)
{
return0;
}
while(str[len]!='\0')
{
len++;
}
returnlen;
}解析:字符串以'\0'作为结束标志,遍历至结束符停止,加入空指针判断,避免程序崩溃,符合工程代码规范。2、手写字符串拷贝函数(不使用strcpy,处理内存重叠)参考答案:c
char*my_strcpy(char*dest,constchar*src)
{
char*tmp=dest;
if(dest==NULL||src==NULL)
{
returnNULL;
}
//处理内存重叠,从后往前拷贝
if(dest>src&&dest<src+strlen(src))
{
char*p_dest=dest+strlen(dest);
constchar*p_src=src+strlen(src);
while(p_src>=src)
{
*p_dest--=*p_src--;
}
}
else
{
while(*src!='\0')
{
*dest++=*src++;
}
*dest='\0';
}
returntmp;
}解析:普通strcpy不处理内存重叠,会出现数据覆盖丢失,工程代码必须兼容重叠场景,同时做空指针校验。六、面试坑点问答(面试官常追问)1、局部变量能否用static修饰?有什么场景价值?参考答案:可以修饰。工程中常用在需要保留函数上次执行状态的场景,比如计数统计、状态标记、单次初始化配置。无需全局变量即可实现数据持久化,减少全局变量滥用,降低代码耦合度。2、free之后指针为什么要置空?不置空会有什
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026儿童安全座椅地方立法多维效果评估与全国立法路径建议研究报告
- 2026 河南 综合管理岗事业编结构化面试含答案
- 2026下半年高中道法教资面试时政题库及解析
- 2026年测试工程师职业技能等级认定(五级)操作技能考前冲刺试题
- 2026年卫生专业技术资格考试(普通外科学专业)专业实践能力章节练习题
- 2026年跆拳道教练员职业技能等级认定理论知识高频考点试题
- 2025年辽宁省凌海市高考历史真题附答案(培优B卷)
- 2025年湖北省洪湖市高二历史上册期末考试考试卷附参考答案(B卷)
- 2026车规级芯片可靠性测试标准对比研究报告
- 2026宠物行业市场现状供需分析及投资评估规划分析研究报告
- 限制类医疗技术临床应用自我评估报告x
- 2026年上海高考英语春考试卷及参考答案(完整版)
- 2026年群众文化专业人员职称考试真题
- 二次函数与一元二次方程 (课件) 2026-2027学年人教版九年级数学上册
- 牙科手机注油机使用方法
- 雨课堂学堂在线学堂云《创新思维与创业实验(东南)》单元测试考核答案
- 2025年国才杯日语笔试真题及答案
- 慢性病管理APP开发
- 函数的单调性 第一课时 课件(共18张) 高一上学期数学人教A版必修第一册
- 光伏项目施工安全管理方案
- 压力容器安全知识培训课件
评论
0/150
提交评论