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

下载本文档

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

文档简介

C语言面试题(含详细答案解析)本次面试题贴合企业实际面试场景,涵盖C语言基础语法、指针、内存管理、函数、结构体、易错坑点等核心考点,题目难度由浅入深,所有答案均附带通俗详细解析,无书面化空洞话术,适配应届生及初级开发岗位面试备考。一、基础语法选择题(10题)1、C语言中char类型变量占用的字节数是?()A、1字节B、2字节C、4字节D、随系统变化答案:A详细解析:C语言标准规定,char类型固定占用1个字节,无论32位还是64位系统,该类型字节数不会改变。其取值范围:无符号char0~255,有符号char-128~127。2、以下哪个不是C语言的基本数据类型?()A、intB、floatC、stringD、double答案:C详细解析:C语言没有string字符串基本类型,字符串是通过char字符数组或字符指针模拟实现的。int、float、double均为C标准基础数据类型。3、全局变量和局部变量的存储位置分别是?()A、栈区、堆区B、全局区、栈区C、堆区、全局区D、栈区、全局区答案:B详细解析:全局变量定义在函数外部,存储在全局静态区,程序运行全程有效;局部变量定义在函数内部,存储在栈区,函数调用结束后立即释放内存、失效。4、inta=10;a+=a-=a*a;最终a的值是?()A、-180B、0C、-90D、100答案:A详细解析:赋值运算符优先级从右往左计算,分步运算:1、先算a*a=100;2、计算a-=100,等价于a=10-100=-90;3、计算a+=-90,等价于a=-90+(-90)=-180。5、以下关于static关键字说法错误的是?()A、静态局部变量只初始化一次B、静态变量存储在全局静态区C、静态局部变量函数调用结束后会销毁D、静态全局变量仅当前文件可见答案:C详细解析:普通局部变量函数结束销毁,静态局部变量不会销毁,程序运行期间始终保留上次的值,且仅第一次调用函数时初始化。6、sizeof(int)在32位、64位系统下的值分别是?()A、2、4B、4、4C、4、8D、8、8答案:B详细解析:C语言中int整型固定占用4个字节,不受系统位数影响;指针变量(int*)32位系统4字节,64位系统8字节,注意区分整型和指针。7、switch语句中,case后面不能跟以下哪种类型?()A、整型常量B、字符常量C、浮点型常量D、枚举常量答案:C详细解析:switchcase仅支持整型、字符型、枚举类型常量,不支持浮点型、字符串、变量。浮点型精度不固定,无法精准匹配判断。8、以下循环体执行次数是?()PlainText

for(inti=0;i<10;i++){

i++;

}A、10次B、5次C、9次D、无限循环答案:B详细解析:循环每次执行:i初始0,执行循环体i++变为1,再执行for的i++变为2,单次循环i自增2。依次循环i=0、2、4、6、8,共执行5次,i=10时跳出循环。9、break和continue说法正确的是?()A、break只跳出当前循环B、continue终止整个循环C、break可以跳过本次循环剩余代码D、continue可用于switch语句答案:A详细解析:break:跳出当前循环/switch语句,终止当前结构;continue:跳过本次循环剩余代码,直接进入下一次循环,不能用于switch。10、数组intarr[5]={1,2};未初始化的元素值为?()A、随机值B、0C、NULLD、无值答案:B详细解析:C语言中数组部分初始化时,未手动赋值的元素会自动初始化为0。如果是未初始化的全局数组全为0,未初始化的局部数组为随机垃圾值。二、指针核心简答题(6题,高频面试)1、指针和指针变量的区别?详细答案解析:1、指针:本质是内存地址,是一个数值,代表内存单元的编号,是常量概念;2、指针变量:是存储内存地址的变量,占用内存空间,可修改、可赋值,是变量概念;简单举例:inta=10;int*p=&a;,&a是指针(地址),p是指针变量。2、野指针是什么?如何避免野指针?详细答案解析:野指针定义:指向未知、非法内存地址的指针,该地址不受程序管控,无法正常读写,不会报错但会造成程序崩溃、内存错乱。产生原因:指针未初始化、指针指向的内存释放后未置空、指针越界访问。避免方法:1、指针定义时直接初始化为NULL;2、动态内存free释放后,立即将指针置为NULL;3、使用指针前先判断是否为NULL;4、杜绝数组、指针越界访问。3、char*p="abc";和charp[]="abc";的核心区别?详细答案解析:1、内存存储不同:char*p指针指向常量字符串区,字符串内容只读,不可修改;charp[]是字符数组,字符串拷贝到栈区,内容可读写修改;2、空间大小不同:sizeof(p)得到指针大小(4/8字节),sizeof(数组名)得到字符串总长度(含结束符\0,为4字节);3、可修改性不同:p[0]='d'会触发段错误,数组形式可以正常修改字符内容。4、一级指针、二级指针的作用是什么?详细答案解析:1、一级指针(int*):直接指向普通变量地址,用于修改变量值、传递数组、减少数据拷贝;2、二级指针(int**):指向一级指针的地址,核心用途:在函数内部修改一级指针的指向、操作二维数组、实现动态二维内存分配。举例:普通函数无法修改实参指针的指向,传入二级指针即可实现指针指向的修改。5、指针加减运算的规则?详细答案解析:指针加减数值,不是单纯的地址数值加减,而是加减对应类型的字节大小。例:int*p,int占4字节,p+1表示地址向后偏移4字节,指向后一个整型元素;char*p,char占1字节,p+1地址向后偏移1字节;指针仅支持和整数加减、同类型指针相减(计算元素个数),不支持指针相加、相乘、相除。6、const修饰指针的三种场景区别?详细答案解析:1、constint*p:修饰指针指向的值,值不可改,指针指向可改,不能通过p修改目标变量,p可以指向其他地址;2、int*constp:修饰指针本身,指针指向不可改,值可改,p的地址固定,不能重新赋值,但可以修改指向的变量值;3、constint*constp:双重修饰,指针指向和目标值都不可修改,完全只读。三、内存管理高频题(4题)1、C语言四大内存分区及各自特点?详细答案解析:1、栈区:存放局部变量、函数参数、函数返回地址,系统自动分配释放,空间小、速度快,超出栈大小会栈溢出;2、堆区:存放malloc、calloc、realloc动态申请的内存,需要手动free释放,空间大、灵活,不手动释放会造成内存泄漏;3、全局/静态区:存放全局变量、static静态变量,程序启动分配、程序结束释放;4、常量区:存放字符串常量、const修饰的常量,内容只读,不可修改,程序结束释放。2、malloc、calloc、realloc的区别?详细答案解析:1、malloc:申请指定字节的堆内存,不初始化,内存为随机垃圾值,参数为单个字节大小;2、calloc:申请n个指定大小的内存,自动初始化为0,参数为元素个数+单个元素大小;3、realloc:重新调整已申请堆内存的大小,可扩容、可缩容,保留原内存数据,扩容失败可能返回新地址。3、什么是内存泄漏?产生原因及解决办法?详细答案解析:内存泄漏:堆区动态申请的内存,使用完毕后未手动free释放,程序运行期间该内存一直被占用,无法被系统回收,长期堆积会导致程序卡顿、内存耗尽崩溃。产生原因:malloc后未free、指针覆盖丢失堆内存地址、函数内申请堆内存未返回释放入口。解决办法:动态内存使用完毕立即free,free后将指针置NULL,养成成对申请释放的编码习惯。4、栈溢出的原因是什么?详细答案解析:1、定义过大的局部数组/变量,超出系统栈默认空间;2、递归函数无终止条件,无限递归,不断压栈导致栈空间耗尽;3、函数嵌套调用层数过多,栈帧堆积溢出。四、结构体与联合体面试题(2题)1、结构体和联合体的区别?详细答案解析:1、内存占用:结构体成员独立占用内存,总大小包含内存对齐填充字节;联合体成员共用同一块内存,总大小为最大成员的字节数;2、使用特性:结构体所有成员可同时赋值使用;联合体同一时间只能使用一个成员,赋值新成员会覆盖旧成员数据;3、用途:结构体用于存储一组不同类型的关联数据;联合体用于节省内存、数据类型转换。2、什么是结构体内存对齐?对齐规则?详细答案解析:内存对齐:编译器为提高CPU读取数据效率,自动对结构体成员内存地址进行对齐填充,避免碎片化读取。对齐规则:1、第一个成员偏移地址为0;2、后续成员偏移地址必须是自身大小的整数倍,不足则填充空字节;3、结构体总大小必须是最大成员大小的整数倍,末尾不足自动填充。五、代码改错实操题(3题,面试必考)1、找出以下代码错误并修正PlainText

voidfun(){

char*p=(char*)malloc(10);

}错误点:1、malloc未判断申请是否成功;2、申请的堆内存未释放,造成内存泄漏;3、缺少头文件stdlib.h。修正代码:PlainText

#include<stdlib.h>

voidfun(){

char*p=(char*)malloc(10);

if(p==NULL){

return;//申请失败直接返回

}

//业务逻辑

free(p);

p=NULL;

}2、找出代码错误PlainText

char*getStr(){

charstr[]="hello";

returnstr;

}错误解析:str是局部数组,存储在栈区,函数调用结束后栈内存释放,返回的地址是非法野指针,调用该函数会出现乱码、程序崩溃。修正方案:将局部数组改为static静态数组,存储在全局区,函数结束不释放内存。3、以下代码输出结果是什么?为什么?PlainText

intmain(){

inta=10,b=20;

int*p=&a;

*p=b;

p=&b;

printf("%d%d",a,b);

return0;

}输出结果:2020详细解析:*p=b通过指针修改a的值为20;后续p只是修改自身指向b的地址,不会改变a、b本身的值,b始终为20,最终输出2020。六、编程手写真题(2题,面试手写代码)1、手写代码:实现字符串反转PlainText

#include<stdio.h>

#include<string.h>

//字符串反转函数

voidstrReverse(char*str){

if(str==NULL){

return;

}

intlen=strlen(str);

inti,j;

chartemp;

for(i=0,j=len-1;i<j;i++,j--){

temp=str[i];

str[i]=str[j];

str[j]=temp;

}

}

intmain(){

charbuf[]="helloworld";

strReverse(buf);

printf("%s\n",buf);

return0;

}2、手写代码:实现冒泡排序(整型数组升序)PlainText

#include<stdio.h>

//冒泡排序

voidbubbleSort(intarr[],intn){

inti,j;

inttemp;

//外层控制排序轮数

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

温馨提示

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

评论

0/150

提交评论