C语言基础面试高频题(含详细答案)_第1页
C语言基础面试高频题(含详细答案)_第2页
C语言基础面试高频题(含详细答案)_第3页
C语言基础面试高频题(含详细答案)_第4页
C语言基础面试高频题(含详细答案)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

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

文档简介

C语言基础面试高频题(含详细答案)说明:本套题目为企业初、复试高频基础考题,覆盖语法核心、指针、内存、结构体、函数、预处理等必考知识点,答案贴合工程实际,通俗易懂,适合面试背诵、笔试刷题。一、基础语法问答题1.简述C语言中const关键字的作用及常见用法参考答案:const的核心作用是修饰只读变量,禁止程序修改该变量的值,同时可以提高代码安全性、方便编译器优化。常见四种用法:1.constinta;修饰普通变量,变量a只读,不可赋值修改。2.constint*p;指针指向的值不可改,指针本身地址可以改。3.int*constp;指针地址固定不可改,指向的数据可以修改。4.constint*constp;指针地址和指向的数据都不可修改。工程中常用const修饰函数形参,防止函数内部误修改传入数据。2.#define和const变量的区别是什么?参考答案:1.处理阶段不同:#define是预处理阶段简单文本替换,不做类型检查;const是编译阶段处理,有严格数据类型校验。2.类型区别:宏定义无数据类型;const变量有明确数据类型。3.作用域不同:#define全局有效,若无特殊限定贯穿整个文件;const变量遵循变量作用域规则。4.内存占用:宏定义不占用内存;const变量会占用内存空间。5.调试性:宏无法调试,const变量可在调试器中查看数值。3.简述static关键字的三种用法参考答案:1.修饰局部变量:静态局部变量,程序生命周期内只初始化一次,函数调用结束后变量值保留,不销毁。2.修饰全局变量:静态全局变量,仅在当前源文件内有效,其他文件无法引用,有效防止全局变量冲突。3.修饰函数:静态函数,仅当前源文件可调用,外部文件不可访问,实现函数私有化。4.全局变量和局部变量的区别参考答案:1.作用域:全局变量定义在函数外,整个工程文件有效;局部变量定义在函数/代码块内,仅当前代码块有效。2.内存位置:全局变量存放在全局数据区;局部变量存放在栈区。3.生命周期:全局变量随程序启动创建,程序结束销毁;局部变量随函数调用创建,函数结束立即销毁。4.默认值:全局变量默认自动初始化为0;局部变量无默认值,是随机脏值,必须手动初始化。二、指针核心面试题(必考)5.指针和指针变量的区别参考答案:指针是内存地址本身,是一个数值;指针变量是用来存放地址的变量。例如:int*p;p是指针变量,p存储的地址值就是指针。日常开发中口语常混用,但本质概念不同。6.*和&符号的作用分别是什么?参考答案:&是取地址符:获取变量的内存地址。*有两种作用:1.定义变量时:代表定义指针变量,如int*p;2.使用变量时:解引用操作,取出指针地址中存储的数据。7.野指针是什么?如何避免野指针?参考答案:野指针:指向未知、不受管控、非法内存地址的指针。指针指向的内存不受程序分配,随意读写会导致程序崩溃、段错误。产生原因:指针未初始化、指针指向的内存已释放、指针越界访问。避免方法:1.定义指针时初始化为NULL;2.指针使用前判断是否为NULL;3.内存释放后立刻将指针置空;4.杜绝指针越界操作。8.空指针和野指针的区别参考答案:1.空指针:赋值为NULL的指针,地址明确,代表不指向任何有效内存,安全性高。2.野指针:地址随机未知,无固定指向,风险极高,会引发未知崩溃。空指针可以判断规避错误,野指针无法判断,是开发中必须杜绝的问题。三、内存管理面试题9.C语言程序内存分区有哪几个?各自存放什么内容?参考答案:1.栈区:存放局部变量、函数参数、函数返回地址。由系统自动分配、自动释放,空间小、速度快。2.堆区:由开发者手动malloc、calloc、realloc申请,free释放。空间大,生命周期由开发者控制,全程手动管理。3.全局/静态区:存放全局变量、static静态变量。程序全程存在,程序结束系统回收。4.常量区:存放字符串常量、const修饰的只读数据,内容不可修改。5.代码区:存放程序编译后的二进制指令,只读。10.malloc、calloc、realloc的区别参考答案:1.malloc:申请指定大小堆内存,不初始化,内存为随机脏值。2.calloc:申请n个指定大小的内存,自动初始化为0,安全性更高。3.realloc:重新调整已申请堆内存的大小,可扩容或缩容,保留原数据。注意:堆内存使用完毕必须free,否则会造成内存泄漏。11.什么是内存泄漏?产生原因和解决办法参考答案:内存泄漏:堆内存申请后,没有手动释放,程序失去对该内存的管控,导致内存无法回收,占用越来越高。常见原因:malloc后未free、指针覆盖丢失堆内存地址、函数内申请堆内存未返回释放入口。解决办法:谁申请谁释放、函数出口统一释放内存、指针置空、规范内存管理逻辑。四、数组与结构体面试题12.数组名和指针的区别参考答案:1.本质不同:数组名代表数组首元素地址,是常量地址,不可修改;指针是变量,可随意修改指向。2.sizeof结果不同:sizeof(数组名)得到整个数组总字节数;sizeof(指针)永远是4字节(32位)或8字节(64位)。3.赋值不同:数组名不能被赋值;指针变量可以随意赋值。数组名在传参时会降级为指针,这是面试最常考的陷阱点。13.结构体结构体对齐规则是什么?为什么需要内存对齐?参考答案:对齐规则:1.结构体每个成员偏移地址必须是自身大小的整数倍;2.结构体整体大小必须是最大成员大小的整数倍;3.不足位置自动填充空字节补齐。对齐原因:硬件读取内存时,按固定块读取,对齐后读取效率更高,避免硬件异常,提升程序运行速度。五、函数与预处理面试题14.形参和实参的区别参考答案:1.实参:调用函数时传入的真实数据,可以是常量、变量、表达式。2.形参:函数定义时括号内的参数,仅在函数内部有效,属于局部变量。参数传递本质:普通变量是值传递,仅拷贝数值,函数内部修改不影响外部;指针是地址传递,可修改外部原变量数据。15.递归函数的优缺点参考答案:优点:代码简洁、逻辑清晰,适合树、链表、分治算法等场景。缺点:递归层层调用占用栈空间,递归深度过大会造成栈溢出;重复计算多,效率低于循环。16.预处理#ifdef、#ifndef、#endif的作用参考答案:主要用于防止头文件重复包含,是工程开发必备写法。原理:第一次包含头文件时定义标识,后续再次包含时判断标识已存在,直接跳过内容,避免重复定义报错。六、易错笔试代码题(带解析)17.简述下面代码问题char*p="hello";p[0]='H';参考答案:代码错误,程序会崩溃。字符串常量存放在常量区,内容只读,不允许修改。指针p指向常量区字符串,尝试修改常量数据触发非法访问。如需修改,应定义字符数组:charp[]="hello";18.局部变量能否返回局部指针?为什么?参考答案:不能。局部变量存放在栈区,函数执行结束后栈内存自动释放,返回的指针会变成野指针,指向的内存数据随机,程序运行异常。如需返回指针,可使用静态局部变量、全局变量、堆内存。19.指针数组和数组指针的区别参考答案:1.指针数组:int*p[];是数组,每个元素都是指针变量,常用于存储字符串数组。2.数组指针:int(*p)[

温馨提示

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

最新文档

评论

0/150

提交评论