C语言常见面试题(含答案解析)_第1页
C语言常见面试题(含答案解析)_第2页
C语言常见面试题(含答案解析)_第3页
C语言常见面试题(含答案解析)_第4页
C语言常见面试题(含答案解析)_第5页
全文预览已结束

下载本文档

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

文档简介

C语言常见面试题(含答案解析)本套题目为企业开发、校招、实习高频C语言面试真题,贴合实际面试场景,覆盖基础语法、指针内存、字符串操作、结构体、程序易错点等核心考点,答案简洁通俗,适配面试口述+笔试场景。一、基础语法选择题(高频必考)1、简述局部变量和全局变量的区别?答案:1.作用域:局部变量定义在函数/代码块内,仅当前代码块有效;全局变量定义在函数外,整个源文件甚至跨文件有效。2.存储位置:局部变量存放在栈区;全局变量存放在全局静态区。3.生命周期:局部变量随函数调用创建、函数结束销毁;全局变量程序运行全程存在,程序结束才释放。4.初始值:局部变量默认无初始值,随机垃圾值;全局变量默认自动初始化为0。2、static关键字在C语言中有哪些作用?答案:1.修饰局部变量:延长变量生命周期,程序运行期间不销毁,仅初始化一次,保留上一次的值。2.修饰全局变量:限制作用域,仅当前源文件可访问,其他文件无法引用。3.修饰函数:将函数变为静态函数,仅当前文件可调用,禁止跨文件调用。3、const关键字的作用是什么?答案:const用来修饰只读变量,被修饰的变量值不可修改,本质是只读变量,不是常量。1.constinta;表示a的值不可修改。2.constint*p;表示指针指向的内容不可改,指针本身地址可改。3.int*constp;表示指针本身地址不可改,指向的内容可改。4、#define和const的区别?答案:1.预处理阶段:#define是预处理宏定义,单纯文本替换,无类型检查;const是变量,编译阶段处理,有严格数据类型检查。2.内存占用:#define不占用内存;const变量会占用内存空间。3.作用域:#define全局生效,无作用域限制;const遵循变量作用域规则。4.调试:const变量可调试查看数值;宏定义无法调试。二、指针与内存核心面试题(重难点)1、指针和数组的关系?数组名本质是什么?答案:数组名本质是数组首元素的地址,是一个常量指针,地址值不可修改。数组访问本质靠指针偏移:a[i]等价于*(a+i),编译时会统一转换为指针运算。区别:数组名sizeof(数组名)得到数组总字节数;指针变量sizeof(指针)永远是4字节(32位系统)/8字节(64位系统)。2、野指针是什么?如何避免野指针?答案:野指针:指向未知、非法、不受系统管控内存地址的指针,没有明确指向,极易造成程序崩溃、段错误。产生原因:指针未初始化、指针指向的内存已释放、指针越界访问。避免方式:1.指针定义时初始化为NULL;2.内存释放后立即将指针置空;3.使用指针前先判断是否为NULL;4.严格控制指针访问范围,避免越界。3、malloc、calloc、realloc的区别?答案:1.malloc:动态开辟指定大小内存,内存内容为随机垃圾值,不初始化。2.calloc:开辟n个指定大小的内存,自动初始化为0,安全性更高。3.realloc:重新调整已开辟动态内存的大小,可扩容、缩容,会自动迁移原内存数据。注意:动态内存必须手动free释放,否则造成内存泄漏;释放后指针必须置空。4、栈内存和堆内存的区别?答案:1.分配方式:栈由系统自动分配、自动释放;堆由程序员手动malloc分配、手动free释放。2.空间大小:栈空间固定、较小;堆空间大、灵活,可动态扩容。3.生命周期:栈变量随函数结束销毁;堆内存全程有效,手动释放才消失。4.存取速度:栈读写速度快;堆速度相对较慢。三、程序改错&易错真题(笔试高频)题目1:找出以下代码的错误PlainText

char*str="hello";

str[0]='a';答案:错误原因:字符串常量存储在只读数据区,不允许修改内容。指针str指向只读区,强行赋值会触发段错误。修正方式:改用字符数组存储,charstr[]="hello";题目2:分析以下代码问题PlainText

int*test()

{

inta=10;

return&a;

}答案:错误:返回局部变量地址。局部变量a存储在栈区,函数执行结束后栈内存释放,返回的地址变成非法地址,形成野指针,后续调用会出现数据错乱、程序崩溃。四、结构体、枚举、联合体面试题1、结构体和联合体的区别?答案:1.内存分配:结构体成员拥有独立内存空间,总大小为所有成员大小之和(包含内存对齐填充);联合体所有成员共用同一块内存空间。2.赋值特性:结构体可同时给多个成员赋值;联合体同一时间只能使用一个成员,赋值新成员会覆盖旧成员数据。3.用途:结构体用于存储一组不同类型的关联数据;联合体用于节省内存、数据类型转换。2、什么是结构体内存对齐?为什么需要对齐?答案:内存对齐是编译器为提高CPU读写效率,自动对结构体成员内存地址做对齐填充的机制。CPU读取对齐的内存数据速度更快,避免多次读取拼接数据,提升程序运行效率,同时适配硬件访问规则。五、手写代码面试题(实操必考)1、手写字符串长度函数(不使用strlen)PlainText

intmy_strlen(char*str)

{

intlen=0;

if(str==NULL)

return0;

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

{

len++;

}

returnlen;

}2、手写字符串拷贝函数(不使用strcpy)PlainText

voidmy_strcpy(char*dest,char*src)

{

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

return;

while(*src!='\0')

{

*dest=*src;

dest++;

src++;

}

*dest='\0';

}六、综合面试问答(面试官口述提问高频)1、简述C语言程序的编译流程?答案:分为四步:预处理、编译、汇编、链接。1.预处理:处理宏定义、头文件、注释删除、条件编译,生成.i文件;2.编译:语法、语义检查,翻译为汇编代码,生成.s文件;3.汇编:将汇编代码转为机器码,生成.o目标文件;4.链接:合并多个目标文件、库文件,解析符号地址,生成可执行文件。2、头文件重复包含的问题如何解决?答案:使用条件编译防止重复包含,两种常用方式:方式1:PlainText

#ifndef__HEAD_H__

#define__HEAD_

温馨提示

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

评论

0/150

提交评论