版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言经典面试题及详细答案(企业实战版)一、C语言基础语法面试题1、简述C语言中局部变量和全局变量的区别?参考答案:1.定义位置:局部变量定义在函数、代码块内部;全局变量定义在所有函数外部。2.作用域:局部变量仅在当前函数/代码块内有效,出作用域立即失效;全局变量从定义位置开始,整个源文件都可使用,其他文件可通过extern引用。3.存储位置:局部变量存储在栈区;全局变量存储在全局静态区。4.初始化值:局部变量未手动初始化时,值为随机垃圾值;全局变量系统默认初始化为0。5.生命周期:局部变量随函数调用创建,函数执行结束销毁;全局变量在程序整个运行周期内始终存在,程序结束后释放。2、static关键字在C语言中有什么作用?参考答案:static主要有三个核心作用,分别修饰局部变量、全局变量、函数:1.修饰局部变量:改变变量的存储区域,从栈区变为静态区,延长生命周期至程序结束,变量只会初始化一次,多次调用函数会保留上一次的值,但作用域不变,仍仅限当前函数。2.修饰全局变量:限制变量作用域,该变量仅能在当前源文件中使用,无法被其他文件通过extern引用,实现文件级私有化。3.修饰函数:限制函数作用域,该函数仅能在当前源文件内调用,外部文件无法访问,常用于封装内部工具函数。3、const关键字的用法和意义?参考答案:const的核心作用是修饰只读数据,防止数据被误修改,提升代码安全性和可读性。1.修饰普通变量:constinta=10;变量a的值不可修改,只能读取。2.修饰指针:-constint*p:指针指向的值不可改,指针本身的地址可以改;-int*constp:指针本身的地址不可改,指向的值可以改;-constint*constp:指针地址和指向的值都不可改。3.修饰函数参数:防止函数内部修改传入的实参数据,常用于字符串、数组、结构体传参。二、指针核心面试题(C语言重难点)1、指针和数组的关系?为什么数组名可以当做指针使用?参考答案:数组名本质上是数组首元素的地址常量,在大多数表达式中,数组名会隐式转换为指向首元素的指针。1.a[i]和*(a+i)完全等价,编译器编译数组下标访问时,本质是通过指针偏移实现;2.数组名是常量,不能进行a++、a=a+1这类赋值操作;普通指针是变量,可以随意修改指向;3.sizeof(数组名)得到的是数组总字节数,sizeof(指针)永远是4字节(32位系统)/8字节(64位系统),这是数组和指针最核心的区别。2、野指针是什么?如何避免野指针?参考答案:野指针是指向未知、非法内存地址的指针,没有合法的内存指向,也不受系统管控。野指针产生原因:指针未初始化、指针指向的内存已释放、指针越界访问。危害:程序崩溃、段错误、随机bug、内存踩踏,问题复现难度极高。避免方法:1.定义指针时主动初始化为NULL;2.指针使用前判断是否为NULL;3.内存释放后,立即将指针置为NULL;4.严格控制指针访问范围,避免数组、内存越界。3、二级指针的使用场景?参考答案:二级指针即指向指针的指针,核心场景有三个:1.函数内部修改一级指针的指向:普通传参是值传递,无法修改实参指针地址,传入二级指针可修改外部一级指针的指向;2.操作字符串数组:char**str可接收字符串数组,用于批量处理多个字符串;3.动态二维内存分配:申请动态二维数组、二维缓冲区时,必须使用二级指针。三、内存管理面试题(高频考点)1、C语言内存分区有哪些?各自存放什么数据?参考答案:程序运行时内存主要分为5个区域:1.栈区:存放局部变量、函数参数、函数返回地址。由系统自动分配释放,空间小、速度快,栈空间溢出会导致程序崩溃。2.堆区:存放malloc、calloc、realloc动态申请的内存。由程序员手动申请、手动释放,全程自主管理,不释放会造成内存泄漏。3.全局静态区:存放全局变量、static静态变量。程序启动分配,程序结束统一释放。4.常量区:存放字符串常量、const修饰的只读常量。数据不可修改,修改会触发段错误。5.代码区:存放程序编译后的二进制指令,只读权限。2、malloc和free的使用注意事项?什么是内存泄漏?参考答案:使用注意事项:1.malloc申请内存后,必须判断返回值是否为NULL,防止申请失败导致程序异常;2.动态内存使用完毕必须手动free释放,避免内存泄漏;3.同一块内存不能重复free,会造成内存错乱;4.内存free后,指针不会自动置空,需手动置NULL,防止形成野指针。内存泄漏:程序员手动申请的堆内存,在程序运行结束前未释放,该内存一直被占用,无法被系统回收,长期运行会导致内存占用越来越高,程序卡顿、崩溃。3、malloc、calloc、realloc的区别?参考答案:1.malloc:申请指定字节数的堆内存,不会初始化内存,内存值为随机垃圾值,参数为内存总字节数。2.calloc:申请n个大小为size的内存空间,自动初始化为0,参数为元素个数、单个元素大小,适合需要清零的场景。3.realloc:重新调整已申请堆内存的大小,可扩容、缩容,会保留原内存数据;扩容失败会返回NULL,不会修改原指针。四、函数与预处理面试题1、函数形参和实参的区别?值传递和地址传递的区别?参考答案:形参:函数定义时括号内的参数,属于局部变量,仅在函数内有效,不占用实际内存。实参:调用函数时传入的真实数据,可以是变量、常量、表达式,占用实际内存。值传递:传递变量的数值副本,函数内部修改形参,不会影响外部实参,适用于普通数据传参。地址传递:传递变量的内存地址,函数内部通过地址修改原值,会直接改变外部实参数据,适用于大数据传参、需要修改实参的场景。2、#define和typedef的区别?参考答案:1.处理阶段:#define是预处理指令,编译前直接文本替换;typedef是关键字,编译阶段处理,是真正的类型重定义。2.作用范围:#define可定义常量、宏、代码片段;typedef仅用于给数据类型起别名。3.类型检查:#define无类型检查,容易产生语法漏洞;typedef有严格的类型校验,安全性更高。4.指针场景差异:#defineint_pint*定义的int_pa,b;等价int*a,b;仅a是指针,b是整型;typedefint*int_p;定义的int_pa,b;a、b均为指针。3、头文件重复包含的问题如何解决?参考答案:多个文件同时引用同一个头文件时,会出现重复定义报错,两种主流解决方式:1.条件编译(通用兼容所有编译器):#ifndef头文件标识#define头文件标识//头文件内容#endif2.#pragmaonce(简洁常用,主流编译器支持):直接在头文件第一行添加,防止重复包含。五、结构体、联合体与枚举面试题1、结构体字节对齐规则?为什么需要字节对齐?参考答案:结构体对齐规则:1.每个成员变量的偏移地址,必须是自身大小的整数倍;2.结构体整体大小,必须是内部最大成员大小的整数倍;3.可通过#pragmapack(n)手动设置对齐基数。对齐原因:硬件读取内存时,按固定字节块读取,对齐后可提升内存读写效率,避免硬件读取异常,是空间换时间的设计。2、结构体和联合体的区别?参考答案:1.内存占用:结构体成员独立占用内存,总大小为对齐后的所有成员大小之和;联合体所有成员共用同一块内存,总大小为最大成员的大小。2.数据存储:结构体所有成员可同时赋值、同时生效;联合体同一时间只能存储一个成员数据,赋值新数据会覆盖旧数据。3.使用场景:结构体用于存储一组关联的不同类型数据;联合体用于节省内存、数据类型转换(协议解析、硬件数据读取)。六、易错笔试题(含代码分析)1、分析以下代码的错误PlainText
char*str="hello";
str[0]='a';参考答案:代码会触发段错误,程序崩溃。原因:"hello"是字符串常量,存储在只读常量区,不允许修改;指针str指向常量区地址,尝试修改常量区数据,触发内存访问权限错误。修正方式:用字符数组存储字符串,charstr[]="hello";数组存储在栈区,可读写。2、分析以下代码的输出结果PlainText
#include<stdio.h>
intmain()
{
inta=10;
int*p=&a;
printf("%d\n",*p++);
printf("%d\n",a);
return0;
}参考答案:输出结果:10、10解析:*p++遵循运算符优先级,后置++先取值再自增。先取出p指向的值10打印,再让指针p的地址偏移4字节,变量a的值始终未改变。3、局部变量能否和全局变量重名?优先级如何?参考答案:可以重名。当局部变量和全局变量重名时,局部变量优先,会屏蔽全局变量。若需要在函数内访问同名全局变量,可通过全局变量作用域区分,或修改变量命名避免冲突。实际开发中禁止重名,避免代码歧义、逻辑bug。七、编程实战面试题(简答+思路)1、手写字符串长度函数strlen(不调用库函数)参考答案:PlainText
unsignedintmy_strlen(constchar*str)
{
unsignedintlen=0;
if(str==NULL)
{
return0;
}
while(str[len]!='\0')
{
len++;
}
return
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026船舶与港口岸电储能系统管理单元特殊需求与技术适配性研究
- 2026基因编辑技术在医疗领域商业化应用前景研究报告
- 2026碳中和背景下光伏产业政策导向与市场机遇报告
- 2026环保型再生木材技术创新及市场应用前景分析报告
- 2026光刻胶化学品企业研发投入强度与创新产出效率相关性研究
- 2026中国液体化工物流行业投资回报率与风险评估报告
- 2026污水处理膜技术成本下降空间分析
- 2026中国碳化硅功率模块在新能源车中的应用渗透率
- 2026医疗AI辅助诊断系统注册审批进展与医院采购偏好研究
- 2026能源转换行业市场深度调研及发展趋势和前景预测研究报告
- 2026年零碳产业园项目投资计划书
- 2026年高考化学全国I卷真题含解析及答案
- 生物制药与基因编辑技术
- RTK测量教程培训城市管理与执法探索
- 宠物解剖生理讲解
- 中级财务会计试题以及答案
- 水稻全程机械化栽培技术
- T∕CSTM 00162-2020 透射电子显微镜校准方法
- key-hole经皮内镜颈椎间盘摘除术治疗神经根型颈椎病后路2
- 室内装修拆除合同
- 【课件】北师大版九年级下册21二次函数课件(25张)
评论
0/150
提交评论