版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言常见面试题及详细答案(企业真实版)一、C语言基础核心面试题1、简述C语言的特点C语言是结构化、模块化的通用编程语言,核心特点有以下几点:1.语法简洁紧凑,关键字少,代码执行效率极高,接近汇编语言;2.兼具高级语言的可读性和低级语言的底层操作性,可直接操作内存、硬件地址,适合底层开发、嵌入式、驱动开发;3.结构化编程,支持顺序、分支、循环三种逻辑,程序逻辑清晰、易于调试维护;4.可移植性强,基本不依赖硬件平台,跨系统编译运行兼容性好;5.没有严格的语法检查,自由度高,但对开发者编码规范要求高,容易出现内存、指针类隐性bug。2、static关键字的作用(面试高频)static主要修饰局部变量、全局变量和函数,三种场景作用不同:(1)修饰局部变量普通局部变量存储在栈区,函数调用结束后立即销毁;static局部变量存储在静态区,程序运行期间一直存在,只会初始化一次,下次调用函数会保留上一次的值。(2)修饰全局变量普通全局变量作用域是整个工程,可跨文件访问;static全局变量仅限当前源文件有效,其他文件无法引用,可避免全局变量命名冲突。(3)修饰函数普通函数可跨文件调用;static函数仅当前文件可调用,隐藏函数实现,防止外部文件误调用。3、const关键字的作用及用法const用于修饰只读变量,被修饰的值无法被修改,核心作用是代码保护、减少bug、提高程序可读性。常见四种用法:1.constinta:a为只读变量,不能修改a的值;2.constint*p:指针指向的值不可改,但指针的指向可以改;3.int*constp:指针的指向不可改,但指针指向的值可以改;4.constint*constp:指针指向和指向的值都不可修改。补充:const修饰的变量存储在只读数据区,编译阶段会做语法校验,杜绝非法修改。4、extern关键字的作用extern是声明关键字,用于告诉编译器:变量或函数的定义在其他文件或当前文件后方,无需重复定义。1.声明外部全局变量:跨文件使用全局变量时,用extern引入,不会开辟新内存;2.声明外部函数:调用其他文件的函数时,可通过extern声明,无需写头文件;3.区别:声明不分配内存,定义才分配内存,一个变量可以多次声明,只能一次定义。5、全局变量和局部变量的区别对比维度全局变量局部变量定义位置所有函数外部函数内部、代码块内部存储区域静态全局区栈区(static修饰除外)生命周期整个程序运行期间函数/代码块执行期间,结束立即销毁作用域默认整个工程,static修饰仅限当前文件仅限当前函数/代码块初始值默认初始化为0默认随机垃圾值,需手动初始化二、指针核心面试题(重难点)1、指针和指针变量的区别指针:本质是内存地址,是一个纯数值,代表内存单元的编号;指针变量:是专门用来存储内存地址的变量,占用固定内存(32位系统4字节,64位系统8字节)。简单理解:地址是指针,存地址的变量是指针变量,日常编码中所说的指针,大多指指针变量。2、野指针是什么?如何避免野指针?野指针定义:指向未知、不受管控内存地址的指针,指针指向的内存没有申请、已释放、或越界。野指针产生原因:1.指针变量未初始化,默认是随机地址;2.指针指向的内存释放后,未将指针置空;3.指针操作越界,访问数组、变量之外的内存。避免方法:1.指针定义时立即初始化为NULL;2.动态内存free释放后,马上将指针置为NULL;3.使用指针前先判断是否为NULL,杜绝空指针解引用;4.严格控制指针偏移,避免数组、内存越界访问。3、空指针和野指针的区别1.空指针(NULL):指向地址为0的指针,是系统预留的无效地址,有明确指向,只是不能访问,安全性高;可通过if判断规避。2.野指针:指向随机未知地址,无任何约束,一旦解引用会导致程序崩溃、内存错乱,无法预判。4、二级指针的作用二级指针即指向指针的指针(char**p),核心使用场景:1.修改一级指针本身的值:函数内想要修改外部一级指针的指向,需要传入一级指针的地址(二级指针);2.操作二维数组、字符串数组:存储多个字符串、二维数据;3.动态开辟二维内存:通过二级指针批量申请一维指针数组,实现二维动态内存。5、指针数组和数组指针的区别(高频易错)1.指针数组:char*arr[]本质是数组,数组的每个元素都是指针变量,主要用于存放多个字符串。例:char*arr[3]={"abc","123","xyz"};2.数组指针:char(*p)[]本质是指针,专门指向一个数组,主要用于操作二维数组,指向数组首地址。口诀:括号优先,数组指针带括号,指针数组不带括号。三、内存管理面试题(笔试重点)1、C语言四大内存分区及特点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:重新调整已开辟堆内存的大小,可扩容、可缩容;扩容时会优先在原内存后方扩容,空间不足则重新开辟新内存,并拷贝原数据。3、什么是内存泄漏?如何避免?内存泄漏:手动在堆区开辟的内存,使用完毕后没有free释放,且丢失了内存指针,导致这块内存程序全程无法复用,一直占用系统资源。避免方法:1.malloc和free成对出现,谁开辟谁释放;2.函数内开辟的堆内存,需要返回给外部使用,避免函数结束丢失指针;3.内存释放后立即将指针置NULL,避免野指针;4.复杂逻辑中,提前预判所有分支,保证所有开辟的内存都能被释放。4、栈溢出的原因1.函数递归层数过多,栈帧不断累积,超出系统栈空间上限;2.函数内定义超大局部数组、结构体,占用栈空间过大;3.局部变量嵌套过多,栈帧堆积严重。解决:大数据存储改用堆内存,控制递归层数。四、结构体、联合体面试题1、结构体和联合体的区别结构体struct:成员变量独立占用内存,总大小为所有成员内存之和(包含内存对齐填充),所有成员可同时赋值、访问,用于存储一组不同类型的关联数据。联合体union:所有成员共享同一块内存空间,总大小为最大成员的内存大小,同一时间只能使用一个成员,常用于类型转换、节省内存、硬件寄存器读写。2、结构体内存对齐规则(高频)内存对齐是编译器为了提高CPU读取效率的优化方式,规则如下:1.结构体每个成员的偏移地址,必须是自身大小的整数倍;2.结构体的总大小,必须是最大基础成员大小的整数倍;3.不足的内存空间,编译器自动填充空字节。举例:structA{chara;intb;};char占1字节,偏移0;int占4字节,需偏移到4,中间填充3字节,总大小8字节。五、预处理与宏定义面试题1、#define和typedef的区别1.#define是预处理指令,单纯文本替换,不做类型检查,编译前直接替换代码,无语法校验;2.typedef是关键字,用于类型重命名,编译阶段处理,有严格的类型检查,安全性更高;3.处理指针时差异明显:#definePchar*会出现类型混乱,typedefchar*P定义的指针类型更规范。2、宏定义带参和函数的区别1.宏是文本替换,无参数类型检查、无返回值,执行速度快,无函数调用开销;2.函数有类型检查、语法校验,安全性高,有调用栈开销,速度慢于宏;3.宏容易产生运算优先级bug,函数逻辑更严谨、可调试。3、#include<>和#include""的区别1.#include<头文件>:优先搜索系统库目录,用于引入系统自带头文件(stdio.h、string.h等);2.#include"头文件":优先搜索当前项目目录,找不到再搜索系统目录,用于引入自定义头文件。六、经典改错、易错笔试题1、返回局部变量指针的错误错误代码:PlainText
char*test(){
charstr[]="hello";
returnstr;
}错误原因:str是局部数组,存储在栈区,函数执行结束后栈内存销毁,返回的指针变成野指针,数据失效。修改方案:将数组改为static静态变量,或改用堆内存开辟。2、free释放内存后的常见错误1.重复free:同一块堆内存多次释放,程序直接崩溃;2.释放后继续使用:free后未置空,指针变为野指针,后续操作引发异常;3.释放非堆内存:不能free栈区、静态区变量。3、if(条件)常见笔误bug错误写法:if(a=1)(赋值操作,恒为真,逻辑错误)正确写法:if(a==1)(判断相等)规避技巧:常量写左边if(1==a),写错会直接编译报错。七、高频编程面试题(带完整代码+解析)1、实现字符串反转PlainText
#include<string.h>
voidstr_reverse(char*str){
if(str==NULL)return;
intlen=strlen(str);
inti=0,j=len-1;
chartemp;
while(i<j){
temp=str[i];
str[i]=str[j];
str[j]=temp;
i++;
j--;
}
}解析:双指针法,首尾交换字符,时间复杂度O(n),需先判空避免野指针操作。2、实现冒泡排序PlainText
voidbubble_sort(intarr[],intn){
inti,j,temp;
for(i=0;i<n-1;i++){
for(j=0;j<n-1-i;j++){
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}3、求字符串长度(不使用strlen库函数)PlainText
intmy_strlen(char*str){
intcount=0;
if(str==NULL)return0;
while(*str!='\0'){
count++;
str++
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院感染管理办法中医院感染暴发的定义与报告流程考试试题
- 七年级地理上册教学设计:太空探索与人类家园的地理视角
- 2026年上海市生产服务合作联社人员招聘考试题库及详细答案解析
- 2026年广东省粤科金融集团有限公司人员招聘笔试参考试题及详细答案解析
- 九年级物理《浮力 阿基米德原理》一轮复习分层作业本教学设计
- 2025医疗器械类考试题库及参考答案
- 高中高二化学能层能级激发态原子光谱教学设计
- 2026安全员测试题库及答案
- 小学二年级体育与健康教学设计:游戏化情境下基础移动能力与协调素质的整合教学
- 2026财经法规期末税法计算案例综合试题及答案
- 新疆维吾尔自治区初中级档案职称考试(档案基础)手机备考题库及答案(2026年)
- 肿瘤心理干预沟通护理课件
- 2026年校招:中国银行试题及答案
- 2026年物业管理条例考核试题及答案
- 公共娱乐场所电气消防安全培训
- 2026秋新版道德与法治五年级上册教学课件:第七课第1课时 社会主义好-自力更生结硕果 有多个微课视频
- 第5课 中国人民站起来了 第1课时 课件(内嵌视频)2026-2027学年道德与法治五年级上册统编版
- 制造业公司绩效考核含全套KPI指标库
- 2026年《资料员》考试题库带答案(考试直接用)
- 水利水电工程基坑临边防护专项方案
- 2026年浙江省绍兴市越城区网格员招录真题(含答案)
评论
0/150
提交评论