C语言面试题(含详细答案·职场实战版)_第1页
C语言面试题(含详细答案·职场实战版)_第2页
C语言面试题(含详细答案·职场实战版)_第3页
C语言面试题(含详细答案·职场实战版)_第4页
C语言面试题(含详细答案·职场实战版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言面试题(含详细答案·职场实战版)本套面试题适配初级/中级IT岗位面试,涵盖C语言核心高频考点、笔试机试常错题、职场开发实操问题,答案摒弃书面化套话,贴合面试官提问侧重点。一、基础语法高频题1、简述C语言中static关键字的三种用法和作用答案:static是静态修饰符,核心特性是改变变量/函数的作用域和生命周期,分三种使用场景:1.修饰局部变量:普通局部变量存储在栈区,函数执行结束后会销毁;static局部变量存储在静态区,程序运行期间始终存在,只会初始化一次,下次调用函数会保留上一次的值。2.修饰全局变量:普通全局变量可以跨文件访问,static全局变量仅限当前源文件使用,其他文件无法引用,有效避免全局变量命名冲突。3.修饰函数:普通函数可以跨文件调用,static修饰的函数为内部函数,仅当前文件可调用,隐藏内部工具函数,提升代码安全性。2、const关键字的作用,以及const修饰指针的区别答案:const核心作用是只读保护,修饰的变量不可被修改,编译阶段会做校验,防止误改数据。1.修饰普通变量:constinta=10;变量a只读,无法重新赋值。2.修饰指针(核心面试考点):-constint*p:指针指向的值不可改,但指针的指向可以改。*p只读,p可以指向其他地址。-int*constp:指针的指向不可改,但指向的值可以改。p地址固定,*p可以赋值修改。-constint*constp:指针指向和指向的值都不可修改,完全只读。3、全局变量和局部变量的区别答案:1.存储位置:全局变量存放在静态全局区;局部变量存放在栈区。2.生命周期:全局变量程序启动创建、程序结束销毁;局部变量函数调用时创建,函数执行结束立即销毁。3.作用域:全局变量整个程序可访问(跨文件需extern声明);局部变量仅所在函数/代码块内有效。4.默认初始化:全局变量默认自动初始化为0;局部变量无默认值,是随机垃圾值,必须手动初始化。二、指针核心重难点(面试必考)1、指针和数组的关系,为什么数组名可以当指针使用?答案:数组名本质是数组首元素的地址常量,在大多数表达式中,数组名会隐式转换为指向首元素的指针,所以可以用指针方式操作数组。核心等价关系:a[i]==*(a+i)==*(i+a)==i[a],这也是数组下标可以互换的原因。注意两个例外场景,数组名不会转换为指针:1.使用sizeof(数组名)时,计算的是整个数组的总字节数,不是指针大小;2.对数组名取地址&数组名,得到的是整个数组的地址,而非首元素地址。2、二级指针的使用场景,什么时候必须用二级指针?答案:二级指针即指向指针的指针,核心场景是在函数内部修改一级指针的指向。普通变量传参是值传递,函数内无法修改实参变量;一级指针传参只能修改指针指向的数据,无法修改指针本身的地址。如果需要在函数内部让外部指针指向新的地址,就需要传入二级指针。常见实战场景:动态内存分配封装函数、字符串指针修改、链表节点插入删除。3、野指针是什么?如何避免野指针问题?答案:野指针是指向未知、非法、不受系统管控内存地址的指针,没有明确初始化,也不是空指针。野指针产生原因:指针未初始化、指针指向的内存释放后未置空、指针越界访问。规避方法:1.指针定义时立即初始化为NULL;2.动态内存free释放后,立刻将指针置为NULL;3.使用指针前先判断是否为NULL,杜绝空指针和解引用野指针;4.严格控制数组、指针访问范围,避免越界。三、内存管理专题(笔试高频)1、C语言四大内存分区及各自特点答案:1.代码区:存放程序编译后的二进制指令,只读,程序运行期间固定不变,权限保护防止篡改。2.全局/静态区:存放全局变量、static静态变量,程序启动分配内存,程序结束释放,全程常驻内存。3.栈区:存放局部变量、函数参数、函数返回地址,由系统自动分配释放,空间小、速度快,栈溢出常见于递归过深、局部数组过大。4.堆区:由开发者手动管理,通过malloc/calloc/realloc分配、free释放,空间大、灵活,生命周期由开发者决定,容易出现内存泄漏、野指针问题。2、malloc、calloc、realloc的区别答案:1.malloc:动态分配指定字节的堆内存,不会初始化内存,内存为随机垃圾值,分配成功返回首地址,失败返回NULL。2.calloc:分配n个大小为size的内存,自动初始化为0,适合需要清零初始化的场景,开销比malloc略大。3.realloc:重新调整已分配堆内存的大小,可扩容、可缩容,扩容时可能会迁移内存地址,使用时需要用临时指针接收返回值,避免内存丢失。3、什么是内存泄漏?如何避免?答案:内存泄漏是指堆区动态分配的内存,使用结束后没有free释放,且程序丢失了该内存的指针地址,导致这块内存一直被占用,无法被系统回收,长期运行会导致程序内存占用越来越高、卡顿、崩溃。规避方法:1.malloc/calloc/realloc申请的内存,必须配对free释放;2.函数多个出口(if/else/return),每个出口都要处理内存释放;3.内存释放后立即将指针置空;4.复杂场景统一封装内存申请和释放接口,规范管理。四、结构体、联合体、枚举1、结构体字节对齐规则,为什么需要字节对齐?答案:对齐规则:1.结构体每个成员的偏移地址,必须是自身大小的整数倍;2.结构体整体大小,必须是最大成员大小的整数倍;3.可通过#pragmapack(n)修改对齐数。对齐目的:硬件读取内存时,按固定字节块读取,对齐后CPU读取效率更高;非对齐内存需要多次读取、拼接数据,会大幅降低程序运行效率,部分硬件还会直接报错。2、结构体和联合体的区别答案:1.内存存储:结构体成员独立占用内存,总大小为对齐后所有成员大小之和;联合体所有成员共享同一块内存空间,同一时间只能存储一个成员的数据。2.大小特点:联合体大小等于最大成员的对齐后大小,极度节省内存。3.使用场景:结构体用于存储一组关联的不同类型数据;联合体多用于硬件编程、协议解析、数据类型转换,节省内存空间。五、预处理与宏定义1、#define宏定义和const变量的区别答案:1.处理阶段不同:#define是预处理阶段直接文本替换,无类型检查;const是编译阶段处理,有严格的数据类型校验。2.类型区别:宏没有数据类型;const变量有明确数据类型,支持类型匹配、参数校验。3.作用域:宏定义从定义处到文件结尾有效,可通过#undef取消;const变量遵循变量作用域规则。4.调试性:const变量可调试、可查看值;宏是纯文本替换,无法调试。2、写一个安全的求最大值宏,并说明普通宏的问题答案:普通宏问题:#defineMAX(a,b)a>b?a:b,传入自增、运算表达式时会触发多次计算,出现逻辑错误。安全宏写法:#defineMAX(a,b)({typeof(a)_a=a;typeof(b)_b=b;_a>_b?_a:_b;})原理:先将参数赋值给临时变量,保证表达式只会计算一次,避免重复运算出错。六、函数与递归、易错坑点1、形参和实参的区别,C语言参数传递是值传递还是地址传递答案:实参是调用函数时传入的真实数据/地址;形参是函数定义时的参数变量,是实参的临时副本。C语言只有值传递:1.普通变量传参:传递的是变量值的副本,函数内修改形参不影响实参;2.指针传参:传递的是地址值的副本,函数内可以修改地址指向的数据,但无法修改实参指针本身的指向。2、递归函数的优缺点,递归栈溢出的原因答案:优点:代码简洁、逻辑清晰,适合树形结构、分治算法、遍历问题(二叉树遍历、斐波那契、阶乘)。缺点:每次递归都会开辟栈帧,占用栈空间,开销大;递归深度过大容易栈溢出。栈溢出原因:没有正确的递归终止条件、递归循环调用、递归深度远超系统栈空间上限。七、编程实操问答题(面试口述/手写代码)1、手写代码:实现字符串反转(不调用库函数)参考答案:c

voidstr_reverse(char*str)

{

if(str==NULL)

return;

intlen=0;

//计算字符串长度

while(str[len]!='\0')

{

len++;

}

//首尾交换反转

inti=0,j=len-1;

chartemp;

while(i<j)

{

temp=str[i];

str[i]=str[j];

str[j]=temp;

i++;

j--;

}

}2、简述数组越界的危害,为什么编译器不直接报错答案:数组越界会篡改栈内存、覆盖其他变量数据、破坏函数栈帧,轻则数据错乱、程序逻辑异常,重则段错误、程序崩溃,还可能引发未知的内存脏数据问题。编译器不报错的原因:C语言是弱类型、高效语言,编译阶段不会做严格的数组边界检查,边界检查会增加编译和运行开销,语言设计层面将内存安全交由开发者手动管控。八、压轴综合面试题1、栈内存和堆内存的核心区别,分别适合什么场景使用?答案:1.管理方式:栈由系统自动分配释放;堆由开发者手动申请、手动释放。2.空间大小:栈空间固定且较小,一般几MB;堆空间极大,可使用系统大部分空闲内存。3.运行速度:栈读写速度快,无额外开销;堆需要内存寻址、分配算法,速度较慢。4.生命周期:栈内存随函数调用结束销毁;堆内存生命

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论