版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言经典面试题及详细答案(企业真实版)整套题目贴合一线互联网、嵌入式、软件开发岗位面试高频考点,难度由浅入深,答案侧重原理讲解、避坑要点和实际开发场景,摒弃书面化套话。一、C语言基础语法面试题1、简述static关键字的作用?(高频)答案:static主要有三个核心作用,分场景使用:1)修饰局部变量:改变变量的生命周期,原本局部变量函数执行结束就释放,被static修饰后,程序运行期间始终占用内存,不会销毁,只会初始化一次。2)修饰全局变量:改变变量的作用域,普通全局变量可以跨文件访问,static全局变量只能在当前源文件使用,其他文件无法引用,起到隔离作用。3)修饰函数:限制函数的作用域,函数仅能在当前文件调用,外部文件不可调用,常用于封装模块内部私有方法。面试加分点:static修饰的变量,默认初始值为0,普通局部变量不初始化是随机脏值。2、const关键字的作用,以及常用使用场景?答案:const是只读修饰符,被修饰的变量/指针不可修改,核心是保护数据,防止误修改。1)修饰普通变量:constinta=10;变量a只读,无法重新赋值。2)修饰指针:-constint*p:指针指向的值不可改,指针本身地址可以改;-int*constp:指针本身地址不可改,指向的值可以改;-constint*constp:地址和值都不可改。3)修饰函数参数:避免函数内部修改传入的实参数据,常用于字符串、数组传参,提升代码安全性。3、#define和const的区别?(必考)答案:1)处理阶段不同:#define是预处理阶段简单文本替换,不做类型检查;const是编译阶段处理,有严格的数据类型校验。2)类型差异:宏定义无数据类型,const常量有明确数据类型。3)作用域不同:宏定义全局有效,无作用域限制;const变量遵循变量作用域规则。4)调试差异:const常量可调试查看值,宏定义是文本替换,无法调试。5)内存占用:宏定义不占用内存,const常量会分配内存空间。二、指针核心面试题(C语言重难点)1、指针和数组的区别?为什么数组名可以当做指针使用?答案:核心区别:1)本质不同:数组是连续的内存空间,存放固定类型数据;指针是存储内存地址的变量。2)大小不同:数组大小由元素个数和类型决定,sizeof(数组名)得到数组总内存;指针大小固定,32位系统4字节,64位系统8字节。3)可修改性:数组名是常量地址,不可赋值修改;指针变量的值可以随意修改,指向不同内存。数组名当指针的原因:数组名默认指向数组首元素的起始地址,在大多数表达式中,数组名会隐式转换为首元素指针,所以可以用指针方式访问数组元素(a[i]等价于*(a+i))。特例:sizeof(数组名)、&数组名这两种场景,数组名不会转换为指针。2、野指针是什么?如何避免野指针?答案:野指针定义:指向未知、不受管控内存地址的指针,没有合法指向,也叫悬空指针。野指针产生原因:1)指针未初始化,默认指向随机地址;2)指针指向的内存释放后,未置空,指针保留无效地址;3)指针操作越界,指向数组、变量之外的内存。规避方法:1)指针定义时直接初始化为NULL;2)内存free/释放后,立即将指针置为NULL;3)使用指针前先判断是否为NULL,避免空指针解引用;4)严格控制指针遍历范围,杜绝越界访问。3、二级指针的使用场景?答案:二级指针即指向指针的指针,核心场景有3个:1)修改一级指针的值:普通函数传一级指针是值传递,无法修改原指针指向,传入二级指针可以修改原指针地址;2)存储二维数组:用二级指针接收动态二维数组地址;3)字符串数组:char**str用于存储多个字符串,是项目中最常用的场景。三、内存管理面试题(高频坑点)1、C语言四大内存分区及存储内容?答案:程序运行时内存分为4个核心区域:1)栈区(stack):存放局部变量、函数参数、函数返回地址;由系统自动分配、自动释放,空间小、速度快,溢出会报栈溢出错误。2)堆区(heap):存放动态申请的内存,由malloc、calloc、realloc分配;需要开发者手动free释放,否则会造成内存泄漏,空间大、速度较慢。3)全局/静态区:存放全局变量、static修饰的静态变量;程序启动分配内存,程序结束才释放。4)常量区:存放字符串常量、const修饰的只读常量;数据不可修改,修改会触发程序崩溃。2、malloc、calloc、realloc三者区别?答案:1)malloc(size_tsize):申请size字节的堆内存,不初始化,内存值是随机脏值,返回void*指针。2)calloc(intnum,size_tsize):申请num个size大小的内存,自动初始化为0,适合需要清零的场景。3)realloc(void*p,size_tsize):重新调整已分配堆内存的大小,可扩容、可缩容;扩容时可能迁移内存地址,返回新指针。开发注意点:动态内存使用完必须free,且free后指针置空,防止野指针和内存泄漏。3、什么是内存泄漏?如何排查和避免?答案:内存泄漏:堆区动态申请的内存,使用完毕后没有手动释放,程序运行期间该内存一直被占用,无法回收,长期积累会导致程序卡顿、崩溃。产生场景:函数内申请堆内存,没有返回释放入口、程序分支跳过free、指针覆盖导致原内存地址丢失。规避方式:谁申请谁释放、函数出口统一释放内存、指针重置前先释放原内存。四、结构体与联合体面试题1、结构体字节对齐规则?为什么需要字节对齐?答案:对齐规则:1)结构体每个成员的偏移地址,必须是自身大小的整数倍;2)结构体整体大小,必须是最大成员大小的整数倍,不足会补空字节。对齐原因:硬件读取内存时,按固定字节块读取,未对齐的内存需要多次读取、拼接数据,效率极低;字节对齐可以提升CPU数据读取效率,部分硬件不支持非对齐访问。2、结构体和联合体(共用体)的区别?答案:1)内存存储:结构体成员占用独立内存,总大小为所有成员对齐后的总和;联合体所有成员共用同一块内存,同一时间只有一个成员有效。2)空间大小:结构体占用空间大;联合体大小等于最大成员的大小,极致节省内存。3)使用场景:结构体用于存储一组不同类型、同时有效的数据;联合体多用于嵌入式开发,节省硬件内存、数据类型转换。五、程序改错&坑点分析题(面试实操)题目1:找出以下代码的错误PlainText
char*get_str()
{
charstr[]="helloworld";
returnstr;
}答案:错误为返回局部数组指针,造成野指针问题。解析:str是函数内部局部数组,存储在栈区,函数执行结束后,栈区内存自动释放,str对应的内存失效。此时返回的地址是无效野指针,外部调用读取会出现乱码、程序崩溃。修改方案:将数组改为static静态数组,存储在静态区,函数结束内存不释放。题目2:分析以下代码问题PlainText
int*p=(int*)malloc(4);
*p=10;
free(p);
*p=20;答案:释放内存后继续操作野指针,内存越界访问。解析:free(p)后,p指向的堆内存已经被系统回收,此时p成为野指针,再次解引用赋值属于非法内存操作,会导致程序崩溃。正确写法:free(p);p=NULL;杜绝野指针。六、手写编程面试题(基础必考)1、手写代码实现字符串反转参考答案(可直接运行):PlainText
#include<stdio.h>
#include<string.h>
//字符串反转函数
voidstr_reverse(char*str)
{
if(str==NULL)return;//空指针校验
intlen=strlen(str);
inti,j;
//首尾交换
for(i=0,j=len-1;i<j;i++,j--)
{
chartemp=str[i];
str[i]=str[j];
str[j]=temp;
}
}
intmain()
{
charbuf[]="interviewtest";
str_reverse(buf);
printf("%s\n",buf);
return0;
}2、手写代码实现冒泡排序(数组升序排序)参考答案(优化版,可直接运行):PlainText
#include<stdio.h>
voidbubble_sort(intarr[],intn)
{
inti,j;
//标记本轮是否发生交换,优化有序数组
intflag;
for(i=0;i<n-1;i++)
{
flag=0;
for(j=0;j<n-1-i;j++)
{
if(arr[j]>arr[j+1])
{
//交换两个数
inttemp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag=1;
}
}
//无交换说明数组已有序,直接退出
if(flag==0)break;
}
}
intmain()
{
intarr[]={5,2,9,1,5,6};
intlen=sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr,len);
//打印结果
for(inti=0;i<len;i++)
{
printf("%d",arr[i]);
}
return0;
}七、高频简答压轴题1、头文件#include<>和#include""的区别?答案:1)#include<文件名>:优先从系统库目录查找头文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年工会个人工作总结【个人工作总结】(3篇)
- icu医院感染年终总结2篇
- 小学道德与法治三下《我们的生活越来越幸福》第三课时教学设计:生活变迁中的家国情怀培育
- 小学五年级下册综合实践活动谁不说咱们的家乡好教学设计
- 2025施工升降机司机安全考试真题及答案
- 2026年云南省设计院集团有限公司人员招聘笔试参考试题及详细答案解析
- 2025乡村医生考试试题库及答案
- 高中英语必修第二册Unit 4 Information Technology教学设计
- 2025学年江苏省如东县重点中学中考联考英语试题含答案
- 2025医学心力衰竭处理考试题目及答案
- 2025年人工智能训练师职业技能认证模拟试卷及答案(金融数据标注规范)
- 2025年职业病诊断医师资格考试(职业性化学中毒)历年参考题库含答案详解(5卷)
- 管道完整性管理课件
- 黄石住房公积金管理办法
- 外委班组等同化管理办法
- 公路工程预算定额
- CJ/T 156-2001沟槽式管接头
- T/CECS 10214-2022钢面镁质复合风管
- JJF(新) 128-2024 热量表配对铂热电阻校准规范
- 黑洞课件教学课件
- 甲方工程管理手册
评论
0/150
提交评论