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

下载本文档

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

文档简介

C语言高难度面试题(含详细真实答案)本套题目精选大厂笔试、面试高频难题,避开基础送分题,聚焦C语言核心坑点、底层原理、代码陷阱,答案贴合工程师口语化讲解,无模板化话术,适合进阶面试备考。一、指针与内存核心难题(面试重中之重)1、写出下面代码的输出结果,并解释原因c

#include<stdio.h>

intmain()

{

charstr[]="abcdef";

char*p=str;

*(p+2)+=1;

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

return0;

}答案:输出abddef详细解析:1、str是字符数组,内存开辟在栈区,内容可修改;p指针指向数组首地址。2、p+2指向数组第三个元素'c',*(p+2)就是取该元素的值。3、+=1对字符ASCII码加1,'c'的ASCII码是99,加1后是100,对应字符'd'。4、数组其余字符不变,最终字符串变为abddef。拓展坑点:如果写成char*str="abcdef";字符串存只读常量区,修改会直接段错误,这是面试高频考点。2、指针数组和数组指针的区别,手写定义并说明用途答案详细解析:很多求职者容易混淆二者,核心口诀:看优先级,[]优先级高于*1、指针数组:char*arr[5];本质是数组,数组里的每个元素是char*类型指针。占用5个指针大小的内存,常用于存储多个字符串。示例场景:存储命令行参数、多个字符串常量。2、数组指针:char(*p)[5];本质是指针,专门指向一个长度为5的字符数组。仅占用一个指针大小内存,主要用于操作二维数组。核心区别:指针数组存多个地址,用于多字符串;数组指针指向整块数组,用于二维数组遍历。3、野指针是什么?如何避免野指针问题?答案详细解析:野指针就是指向未知、非法、不受控内存地址的指针,没有合法的内存指向,也叫悬空指针。产生原因:1、指针未初始化,局部指针变量默认是随机地址;2、指针指向的内存释放后,未置空,指针依旧保留原地址;3、指针越界访问内存。危害:程序随机崩溃、段错误、内存踩踏、bug难以复现排查。规避方法:1、指针定义时直接初始化为NULL;2、free释放内存后,立刻将指针置为NULL;3、使用指针前先判断指针是否为NULL;4、严格控制指针访问范围,避免数组、内存越界。二、内存管理与堆栈难点1、栈内存、堆内存、全局内存的区别,以及各自特点答案详细解析:1、栈内存(stack)由系统自动分配、自动释放,存放局部变量、函数参数、函数返回地址。空间小、读写速度快,生命周期随函数,函数执行结束立即回收。栈溢出常见于递归太深、局部数组过大。2、堆内存(heap)由开发者手动malloc/calloc分配、手动free释放,空间极大,灵活可控。生命周期由开发者决定,不主动释放会造成内存泄漏,释放后继续使用会产生野指针。3、全局/静态内存存放全局变量、static静态变量,程序启动分配、程序结束才释放。生命周期贯穿整个程序运行过程,静态变量只会初始化一次。2、malloc、calloc、realloc的区别,面试必考坑点答案详细解析:1、malloc(size_tsize):分配指定大小堆内存,不会初始化内存,内存内是随机脏数据,效率最高。2、calloc(intnum,size_tsize):分配num个大小为size的内存,自动初始化为0,适合数组、计数器场景,效率略低于malloc。3、realloc(void*p,size_tsize):重新调整已分配堆内存的大小,可扩容、可缩容。高频坑点:①realloc扩容时可能会重新开辟新内存,原指针地址会失效,不能直接用原指针接收返回值;②所有堆内存分配后,必须判断返回值是否为NULL,防止分配失败;③同一块内存不能重复free,不能free栈内存、常量内存。三、结构体、位运算难点1、结构体内存对齐规则?为什么需要内存对齐?答案详细解析:结构体对齐三大规则:1、结构体每个成员的偏移地址,必须是自身大小的整数倍;2、结构体整体大小,必须是最大成员大小的整数倍;3、可以通过#pragmapack(n)手动指定对齐字节数。为什么要对齐:CPU读取内存是按块读取(4字节、8字节),未对齐的内存需要CPU读取两次再拼接,严重降低读写效率;部分硬件架构不支持非对齐访问,会直接报错。2、手写计算下面结构体大小(32位系统)c

structTest

{

chara;

intb;

shortc;

};答案:12字节详细解析:32位系统默认4字节对齐,最大成员int为4字节。1、chara:占1字节,偏移0,补3字节对齐;2、intb:占4字节,偏移4-7;3、shortc:占2字节,偏移8-9,整体需要补齐为4的整数倍,补2字节;总大小12字节。四、预处理与宏定义陷阱(高频错题)1、宏定义和函数的区别,宏定义的致命坑点答案详细解析:1、宏是纯文本替换,预处理阶段直接替换代码,无参数校验、无返回值、不占调用栈,执行速度快。2、函数是编译阶段处理,有参数类型校验、有调用开销、安全严谨。宏定义最大坑点:运算优先级问题错误示例:#defineSUM(a,b)a+b调用SUM(1+2,3)*2会被替换成1+2+3*2=9,和预期结果不符。正确写法:#defineSUM(a,b)((a)+(b)),必须全员加括号规避优先级问题。2、#define、const、typedef的区别答案详细解析:1、#define:预处理文本替换,无类型检查,可定义常量、宏函数,作用域全局,可重复定义覆盖。2、const:定义只读变量,有明确数据类型,编译器做类型校验,占用内存空间,作用域受代码块限制。3、typedef:类型重命名,仅给已有数据类型起别名,不生成新类型,常用于简化结构体、指针类型书写。五、程序易错陷阱题(面试手撕题)1、下面代码有什么问题?c

char*getStr()

{

charbuf[]="helloworld";

returnbuf;

}答案:严重错误,返回栈区野指针详细解析:buf是局部数组,开辟在栈内存,函数执行结束后,栈内存被系统回收销毁。此时返回的buf地址是无效地址,外部调用该指针会导致未定义行为,随机崩溃、乱码。解决方案:1、加static修饰,将buf放到静态内存,生命周期全局;2、在主函数开辟内存,传入子函数修改;3、手动malloc堆内存返回。2、strlen和sizeof的核心区别答案详细解析:1、sizeof是运算符,编译阶段计算,获取变量/类型占用的总内存大小,包含结束符'\0'。2、strlen是库函数,运行阶段遍历字符串,统计有效字符个数,不包含'\0',遇到'\0'立刻停止。经典示例:charstr[]="1234";sizeof(str)=5(包含结束符)strlen(str)=4(仅有效字符)六、手撕代码高频难题1、不使用第三方库函数,手写字符串反转函数c

#include<stdio.h>

voidstrReverse(char*str)

{

if(str==NULL)

return;

//计算字符串长度

intlen=0;

char*p=str;

while(*p!='\0')

{

len++;

p++;

}

//首尾交换

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[]="hellointerview";

strReverse(buf);

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

return0;

}2、手写判断素数函数(高效写法)c

#include<stdio.h>

#include<math.h>

//返回1是素数,0不是

intisPrime(intnum)

{

if(num<2)

return0;

//只遍历到平方根,优化效率

for(inti=2;i<=sqrt(num);i++)

{

if(num%i==0)

return0;

}

return1;

}

intmain()

{

intn;

scanf("%d",&n);

if(isPrime(n))

printf("是素数\n");

else

printf("不是素数\n");

return0;

}七、终极面试问答(进阶压轴题)1、什么是内存泄漏?如何排查和避免?答案:内存泄漏是堆内存分配后,程序不再使用该内存,却没有执行free释放,导致这块内存一直被占用,系统无法回收,长期运行会导致内存占用越来越高,程序卡顿、崩溃。常见场景:函数内malloc,函数结束未释放、指针覆盖丢失堆内存地址、异常分支跳过free。排查方式:Linux下使用valgrind工具检测内存泄漏

温馨提示

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

最新文档

评论

0/150

提交评论