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

下载本文档

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

文档简介

C语言经典面试题(含详细答案·企业真实版)一、基础语法高频题1、简述static关键字的三种用法(必考)标准答案:static是静态修饰符,在C语言中有3个核心用法,分场景生效:1)修饰局部变量:改变变量的生命周期,不改变作用域。普通局部变量函数调用结束就销毁,static局部变量会常驻内存,程序结束才释放,只会初始化一次。2)修饰全局变量:改变变量的作用域。普通全局变量可以跨文件访问,static全局变量只能在当前源文件使用,其他文件无法引用,实现文件私有化。3)修饰函数:限制函数作用域。普通函数可跨文件调用,static函数仅当前文件可用,隐藏内部工具函数,避免全局命名冲突。面试加分补充:static变量存储在静态数据区,不在栈区,不会随函数入栈出栈销毁。2、#define和const的区别?工作中怎么选?标准答案:1)预处理阶段不同:#define是预编译指令,纯文本替换,不做语法检查;const是变量修饰符,编译阶段生效,会做类型校验。2)类型区别:#define无数据类型;const常量有明确数据类型。3)内存占用:#define不占用内存,只是文本替换;const常量会开辟内存空间。4)作用域:#define全局生效(undef取消为止);const遵循变量作用域规则。工作选型:单纯定义固定数值、宏函数用#define;需要类型安全、局部常量、调试查看变量值,优先用const。3、sizeof和strlen的核心区别?标准答案:1)本质不同:sizeof是C语言运算符,计算数据类型/变量占用的内存总字节数;strlen是库函数,仅用于计算字符串有效长度(不含结束符\0)。2)计算规则:sizeof包含字符串末尾的\0;strlen遇到\0立即终止,不统计\0。3)适用范围:sizeof可计算所有数据类型(int、数组、结构体、指针);strlen只能用于字符指针/字符数组。4)执行阶段:sizeof编译阶段计算结果;strlen运行阶段遍历计算。举例易错点:charstr[]="abc";//sizeof=4(a+b+c+\0),strlen=3二、指针核心高频题(面试重中之重)1、指针和数组的区别?为什么数组名可以当指针用?标准答案:核心区别:数组是连续内存空间,指针是存储内存地址的变量。1)大小不同:数组sizeof为总内存大小;指针在32位系统占4字节,64位占8字节。2)可修改性不同:数组名是常量地址,不能赋值(arr++报错);指针变量可自由修改指向(p++合法)。3)存储内容不同:数组存的是数据本身;指针存的是别的变量的地址。数组名当指针的原因:数组在多数表达式中会隐式转换为首元素指针,所以arr[i]等价于*(arr+i),但这只是语法兼容,二者本质完全不同。2、野指针是什么?怎么避免野指针?标准答案:野指针:指向未知、非法、未授权内存地址的指针,指针变量有地址值,但指向的内存不受当前程序管控。产生原因:1)指针未初始化,随机分配垃圾地址;2)指针指向的内存释放后,未置空,指针变成悬空指针;3)指针越界访问数组/内存。规避方法:1)指针定义时直接初始化为NULL;2)free释放内存后,立即将指针置为NULL;3)使用指针前先判断是否为NULL;4)严格控制指针访问范围,避免越界。3、二级指针的使用场景?标准答案:二级指针是指向指针的指针,工作中核心3个场景:1)修改一级指针本身的值:函数内部想修改外部指针的指向,必须传二级指针(普通传参是值传递,无法修改原指针)。2)存储二维数组、字符串数组:char**p可接收多个字符串,适配字符串数组场景。3)动态内存二维分配:动态创建二维数组、链表二级节点等结构。三、内存管理高频题1、C语言四大内存分区及存储内容标准答案:1)栈区(stack):存储局部变量、函数参数、函数返回地址。系统自动分配、自动释放,空间小、速度快,栈溢出多是数组越界、递归过深导致。2)堆区(heap):存储malloc、calloc、realloc动态申请的内存。需要程序员手动free释放,否则内存泄漏,空间大、灵活。3)静态常量区:存储全局变量、static静态变量、字符串常量。程序启动分配,程序结束释放。4)代码区:存储程序二进制指令、常量字符串,只读不可修改。2、malloc、calloc、realloc区别?标准答案:1)malloc:动态申请指定字节内存,不初始化,内存是随机垃圾值。2)calloc:申请n个大小为size的内存,自动初始化为0,适合需要清零的场景。3)realloc:重新调整已分配堆内存的大小,可扩容、缩容,会自动迁移原内存数据。工作注意点:realloc扩容可能更换内存地址,禁止直接原指针接收返回值,需用临时指针接收,避免扩容失败丢失原数据。3、内存泄漏是什么?如何排查和避免?标准答案:内存泄漏:堆区动态申请的内存,使用完毕后未free释放,程序一直占用内存,长期运行导致内存占用越来越高、卡顿、崩溃。产生场景:函数提前return跳过free、指针覆盖丢失内存地址、异常分支未释放内存。规避和排查:1)malloc和free成对出现,统一代码规范;2)所有分支(if/else、异常)都要保证内存释放;3)使用内存检测工具(Valgrind)排查泄漏点;4)内存释放后立即置空,防止野指针。四、结构体与枚举、联合体1、结构体字节对齐规则?为什么需要字节对齐?标准答案:对齐规则:1)每个成员变量的偏移地址,必须是自身大小的整数倍;2)结构体整体大小,必须是最大成员大小的整数倍;3)可通过#pragmapack(n)手动指定对齐模数。对齐目的:CPU读取内存是按块读取,未对齐内存需要两次读取、拼接数据,效率极低;字节对齐可以提升CPU访问内存的效率,部分硬件架构必须对齐,否则直接报错崩溃。2、结构体和联合体的区别?标准答案:1)内存存储:结构体成员独立占用内存,总大小是所有成员对齐后的总和;联合体所有成员共用同一块内存,同一时间只能存储一个成员数据。2)大小不同:结构体大小由所有成员决定;联合体大小等于最大成员的大小。3)使用场景:结构体用于存储一组关联的不同数据;联合体用于节省内存、数据类型转换(嵌入式常用)。五、高频易错面试题(坑题必刷)1、全局变量和局部变量的区别?标准答案:1)作用域:全局变量整个程序生效;局部变量仅所在函数/代码块生效。2)生命周期:全局变量程序全程存在;局部变量代码块执行结束立即销毁。3)存储位置:全局变量在静态区;局部变量默认在栈区。4)初始化:全局变量默认自动初始化为0;局部变量默认是随机垃圾值,必须手动初始化。2、函数参数传递是值传递还是地址传递?标准答案:C语言只有值传递,没有地址传递、引用传递。所谓的“传地址”,本质是将指针变量的值(内存地址)拷贝一份传给形参,形参可以通过地址修改原变量内存的数据,但指针变量本身还是值传递。通俗理解:传普通变量,拷贝数据;传指针,拷贝地址,原理都是值拷贝。3、头文件重复包含的问题怎么解决?标准答案:多个头文件互相引用时,会导致同一个头文件被重复包含,引发变量、函数重定义报错。两种解决方法:1)条件编译(企业最常用):#ifndef宏名#define宏名//头文件内容#endif2)#pragmaonce(编译器支持,简洁常用)六、手写代码面试题(实操必考)1、手写字符串拷贝函数(不使用strcpy)标准答案(工业级代码,容错性强):c

voidmy_strcpy(char*dest,constchar*src)

{

//判空,防止野指针访问

if(dest==NULL||src==NULL)

{

return;

}

//逐个拷贝,直到src结束符

while(*src!='\0')

{

*dest=*src;

dest++;

src++;

}

//手动添加字符串结束符

*dest='\0';

}面试考点:空指针判断、原字符串加const保护、手动补\0,这三点是区分新手和老手的关键。2、手写交换两个int变量的三种方法标准答案:c

//方法1:临时变量(最安全、无溢出)

voidswap1(int*a,int*b)

{

inttemp=*a;

*a=*b;

*b=temp;

}

//方法2:加减法(无临时变量,可能溢出)

voidswap2(int*a,int*b)

{

*a=*a+*b;

温馨提示

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

评论

0/150

提交评论