版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
大厂C语言高频面试题及详细答案(实战版)一、C语言基础核心面试题1、简述C语言static关键字的三种用法和作用答案:static是C语言高频考点,一共三种使用场景,作用各不相同:(1)修饰局部变量普通局部变量存储在栈区,函数调用结束后会立即销毁;被static修饰后,变量存储在静态数据区,生命周期贯穿整个程序运行周期,只会初始化一次,下次调用函数会保留上一次的值。同时作用域不变,仅能在当前函数内使用。(2)修饰全局变量普通全局变量可以跨文件访问,被static修饰后,全局变量的作用域被限制在当前源文件,其他文件无法引用,有效避免全局变量命名冲突。(3)修饰函数普通函数可以被其他文件调用,static修饰的函数为静态函数,仅能在当前源文件内部调用,对外隐藏接口,适合封装模块内部私有逻辑。2、const关键字的作用,以及const不同写法的区别答案:const核心作用是修饰只读变量,禁止修改对应数据,提升代码安全性,同时辅助编译器优化代码。常见四种高频写法:(1)constinta;//修饰变量a,a的值不可修改(2)constint*p;//指针指向的值不可改,指针本身地址可以改通俗理解:不能通过p修改指向的内容,但p可以指向其他变量。(3)int*constp;//指针本身地址不可改,指向的值可以改通俗理解:p的指向固定,不能指向其他变量,但可以修改当前指向变量的值。(4)constint*constp;//地址、指向的值都不可修改,完全只读指针总结:const靠近谁,谁就不可修改。3、#define和const的区别(大厂必考)答案:1、预处理阶段vs编译阶段:#define是预处理宏定义,预处理阶段直接文本替换,不做类型检查;const是常量修饰符,编译阶段生效,会做严格的类型校验。2、类型差异:宏常量没有数据类型,只是纯文本替换;const常量有明确的数据类型,编译器可以进行类型判断、语法检查。3、内存占用:#define宏定义不占用内存,仅替换文本;const常量会在内存中分配空间(只读数据区)。4、作用域:宏定义默认从定义处到文件结尾,可通过#undef取消;const常量遵循变量作用域规则(局部/全局)。5、调试性:宏定义无法调试,没有变量符号;const常量可以断点调试,可读性更强。二、指针核心面试题(C语言重难点)1、指针和数组的区别?为什么数组名不等于指针?答案:很多人误区:认为数组名就是指针,实际二者本质完全不同,只是使用场景高度相似。1、本质不同:数组是连续的内存空间,是一组相同类型数据的集合;指针是存储内存地址的变量,仅占4字节(32位)/8字节(64位)。2、sizeof结果不同:sizeof(数组名)计算的是整个数组的内存大小;sizeof(指针)永远是指针本身的大小,和指向的数据无关。3、可修改性:数组名是常量地址,不可赋值修改;指针变量是变量,可以随意修改指向的地址。4、传参差异:数组作为函数参数时,会退化为指针,丢失数组长度信息;原生指针传参始终是地址传递。补充:数组名在大多数表达式中会隐式转换为指向数组首元素的指针,所以用法相似,但底层本质不同。2、野指针是什么?野指针的成因及规避方法答案:野指针:指向未知、非法、不受系统管控内存地址的指针,对野指针读写会导致程序崩溃、段错误、随机bug。常见成因:1、指针未初始化:局部指针变量默认是随机垃圾地址,未置NULL直接使用;2、指针指向的内存已释放:malloc/free、new/delete释放内存后,未将指针置空,指针变成野指针;3、指针越界访问:数组指针、遍历指针超出合法内存范围。规避方法:1、指针定义时直接初始化为NULL;2、内存释放后,立即将指针置为NULL;3、使用指针前先判断是否为NULL,避免空指针和解引用野指针;4、严格控制指针遍历范围,防止越界。3、空指针和野指针的区别答案:1、定义不同:空指针是赋值为NULL的指针,指向0地址,是合法指针;野指针指向随机非法地址,是非法指针。2、可控性不同:空指针可以提前判空规避错误;野指针完全不可控,地址随机,无法预判。3、报错表现不同:空指针解引用必定触发段错误,问题稳定可复现;野指针可能随机崩溃、正常运行、数据错乱,bug极难排查。4、使用规范:代码中允许存在空指针,禁止出现野指针。三、内存管理面试题(笔试面试高频)1、C语言四大内存分区及各自特点答案:C语言程序运行时内存分为:栈区、堆区、全局/静态区、常量区。1、栈区(stack)存放局部变量、函数形参、函数返回地址;由系统自动分配、自动释放;空间小、速度快;栈空间固定,溢出会报栈溢出错误。2、堆区(heap)由程序员手动申请、手动释放(malloc、calloc、realloc、free);空间极大,可动态扩容;使用不当会造成内存泄漏、野指针问题;程序结束后系统自动回收堆内存。3、全局/静态区存放全局变量、static修饰的静态变量;程序运行期间全程存在,程序结束后释放;分为已初始化区和未初始化区。4、常量区存放字符串常量、const修饰的只读常量;内容不可修改,修改会触发段错误;程序结束后释放。2、malloc、calloc、realloc的区别答案:三者都是堆内存动态分配函数,核心区别在初始化和扩容逻辑:1、malloc(size_tsize)分配size字节堆内存,不会初始化内存,内存中是随机垃圾值;分配成功返回首地址,失败返回NULL。2、calloc(size_tnum,size_tsize)分配num个大小为size的连续内存,自动初始化为0;适合数组、计数器等需要初始归零的场景,效率比malloc略低。3、realloc(void*p,size_tsize)用于扩容/缩容已分配的堆内存;p为原内存地址,size为新内存大小。特点:扩容时若原内存后方有空闲空间,直接原地扩容;若无空闲空间,会重新开辟新内存、拷贝原数据、释放旧内存。3、什么是内存泄漏?如何避免内存泄漏答案:内存泄漏:手动申请的堆内存,在程序结束前没有手动free释放,且丢失了内存地址,导致这部分内存无法被复用,一直占用系统资源。长期运行会导致内存占用越来越高,程序卡顿、崩溃。常见场景:函数内malloc后未free、指针覆盖丢失内存地址、异常分支跳过free逻辑。避免方法:1、malloc和free成对出现,谁申请谁释放;2、内存使用完毕立即释放,不长期占用无用堆内存;3、多分支代码保证所有分支都能执行free;4、释放内存后及时将指针置NULL,防止重复释放;5、大型项目使用内存检测工具排查泄漏问题。四、结构体、联合体面试题1、结构体内存对齐规则?为什么需要内存对齐答案:内存对齐规则:1、结构体每个成员的偏移地址,必须是自身大小的整数倍;2、结构体整体大小,必须是结构体最大基础成员大小的整数倍;3、可以通过#pragmapack(n)手动指定对齐字节数。内存对齐原因:CPU读取内存是按块读取(4字节/8字节),未对齐的内存需要CPU读取两次数据再拼接,效率极低;内存对齐可以提升CPU数据读取效率,同时适配硬件架构要求,部分硬件不支持非对齐内存访问,会直接报错。2、结构体和联合体的区别答案:1、内存存储方式:结构体成员拥有独立内存空间,互不干扰;联合体所有成员共用同一块内存空间,同一时间只能使用一个成员。2、内存大小:结构体大小遵循内存对齐规则,是所有成员占用内存之和+对齐填充字节;联合体大小等于其最大成员的内存大小。3、使用场景:结构体用于存储一组关联的不同类型数据;联合体用于节省内存、数据类型转换(网络编程、协议解析常用)。4、赋值影响:结构体修改一个成员,不影响其他成员;联合体修改一个成员,会覆盖其他成员的数据。五、预处理与程序陷阱面试题1、预处理、编译、汇编、链接四个阶段的作用答案:1、预处理:处理#开头的指令,宏替换、头文件展开、条件编译、删除注释,生成预处理文件;不做语法检查。2、编译:对预处理后的代码进行语法、语义检查,翻译为汇编代码,生成汇编文件。3、汇编:将汇编代码翻译为机器指令,生成二进制目标文件(.o/.obj)。4、链接:合并多个目标文件、库文件,解析符号引用,分配虚拟地址,生成可执行文件。分为静态链接和动态链接。2、宏定义的常见坑点答案:1、运算符优先级问题:宏只是文本替换,不加括号会导致运算逻辑错误。例:#defineSQR(x)x*x,调用SQR(2+3)会解析为2+3*2+3,结果错误,正确写法必须加括号。2、参数重复计算:宏参数为自增、自减表达式时,会多次执行运算。3、宏末尾多余分号:导致语法报错,代码冗余。4、宏无类型检查:参数类型不匹配不会报错,运行时出现未知错误。六、高频代码改错/辨析题1、返回局部变量指针为什么会出错?答案:局部变量存储在栈区,函数执行结束后,栈区内存会被系统回收销毁,变量地址变为非法地址。如果函数返回局部变量的指针,外部调用时操作该指针,就是访问野指针,会出现数据错乱
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年陕西省渭南市公务员人员招聘笔试备考试题与答案详解
- 2026年甘肃省兰州市直事业单位第二轮选调47人考试模拟试题及答案解析
- 2026年互联网行业竞争格局与投资机会研究报告
- 2026年跨境电商行业政策环境及市场趋势分析
- 2026实木门窗系统在被动式建筑中的应用前景报告
- 2026实木行业供应链金融模式与风险控制分析报告
- 2026实木家居智能化生产模式与成本控制分析报告
- 2026年宁夏回族自治区中卫市公务员人员招聘笔试模拟试题与答案详解
- 2026年新型城镇化建设行业洞察报告及未来五至十年发展趋势报告
- 2026年衡阳市雁峰区公务员人员招聘笔试试题与答案详解
- 停车场电力施工方案
- 《碳中和原理与技术》全套教学课件
- 2027贵州航天电器秋季招聘284人笔试备考试题及答案详解
- ISO 15510-2024 中文版(不锈钢 化学成分和交货技术条件)
- 2026国家保安员资格考试题库及答案(真题汇编)
- 兵团职工考试试题及答案
- 2026上半年教师资格证面试《高中历史》简案+逐字稿
- ISO 20400-2017 可持续采购指南培训课件
- 2025年国家开放大学(电大)《市场营销学概论》期末考试复习题库及答案解析
- GJB573B-2020 引信及引信零部件环境与性能试验方法
- 交通支持系统船舶建造(购置)项目可行性研究报告编制办法(试行)
评论
0/150
提交评论