面试官最爱问:C语言指针、内存、结构体必问合集

张开发
2026/5/4 9:58:59 15 分钟阅读
面试官最爱问:C语言指针、内存、结构体必问合集
文章目录前言指针这不是魔法就是个门牌号面试陷阱题int *p 和 int* p 有啥区别二级指针指针的指针套娃警告内存管理你的每一分钱字节都在被审计栈和堆自动售货机 vs 银行柜台面试爱考的坑malloc、calloc、realloc核心区别内存对齐为什么结构体大小不等于成员大小之和面试技巧结构体内存压缩方法结构体面向对象的祖师爷柔性数组结构体的最后一招位域Bit-field把一个字节掰成八瓣用实战面试话术怎么把简单题答出高级感目前国内还是很缺AI人才的希望更多人能真正加入到AI行业共同促进行业进步增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow教程通俗易懂高中生都能看懂还有各种段子风趣幽默从深度学习基础原理到各领域实战应用都有讲解我22年的AI积累全在里面了。注意教程仅限真正想入门AI的朋友否则看看零散的博文就够了。前言说实话现在AI大模型这么火很多小伙伴都跑去学Python调API了结果一到面试环节HR突然来一句“来手写个C语言链表翻转”当场人就懵了。别慌这事儿我太熟了。不管是嵌入式、操作系统还是搞AI推理引擎优化C语言就像老丈人的灵魂拷问——你可以平时不用但面试肯定躲不掉。今天咱就把指针、内存、结构体这三大面试刺客拎出来用最糙的大白话给你整明白。指针这不是魔法就是个门牌号面试官最爱问的往往不是让你写个冒泡排序而是看似简单的“指针到底是个啥”我见过太多小伙伴一紧张就开始背定义“指针是存储变量地址的变量…” 停这话一出面试官就知道你在背书。咱换个说法指针就是你家快递柜的取件码。你想啊你网购了个东西数据不可能一直捧手里吧得放快递柜内存里。指针就是那个6位取件码告诉你东西在第3排第2格。没有取件码你只能在快递柜前傻站着挨个格子翻——这就是野指针翻着翻着可能就翻到别人家的格子越界访问被打出来段错误。面试陷阱题intp 和 intp 有啥区别这题贼坑。很多面试官自己都写int* p觉得这样看起来更清晰星号挨着类型表明这是个int指针类型。但真相是在C语言里这两写法对编译器来说一毛一样。坑在哪呢看这段代码int*p,q;// 你是不是以为p和q都是int*实际上只有p是指针q就是个普通int星号其实是跟着变量名走的。所以这题的标准答案应该是**没区别但建议 intp,q 这样写避免误解或者一行只声明一个变量别省那点儿屏幕空间。二级指针指针的指针套娃警告面试进阶题常考二级指针。有的小伙伴一听指向指针的指针就头大觉得这是什么俄罗斯套娃。其实很简单。你有个朋友一级指针他告诉你快递柜号。现在还有个朋友的朋友二级指针他告诉你你那个朋友的微信号是多少。实际场景就是函数里修改指针本身。比如你要在函数里给指针分配内存voidget_memory(char**p){// 必须用二级指针*pmalloc(100);// 修改的是指针p指向的内容}要是写成void get_memory(char *p)你传进去的是指针的副本函数里malloc的地址根本带不出来回来一看p还是NULL当场心态爆炸。这事儿我踩过坑调试了俩小时才发现是传值传引用的问题。内存管理你的每一分钱字节都在被审计C语言没有垃圾回收内存就像你钱包里的现金花出去了得自己记着丢了就是真丢了内存泄漏。栈和堆自动售货机 vs 银行柜台面试官常问“局部变量存在哪malloc的内存存在哪”用最糙的话说栈Stack就是自动售货机。你投币进入函数饮料出来分配内存喝完走人函数结束机器自动把杯子收了内存自动释放。快是快但售货机空间就那么点儿大而且杯子用完就得扔生命周期受限。堆Heap是银行柜台。你得填申请表malloc银行给你开个保险箱分配内存你想存多久存多久。但问题来了——你得自己记得去注销free不然银行一直扣你管理费内存泄漏直到你破产程序崩溃。面试爱考的坑malloc、calloc、realloc核心区别malloc是盲盒分配给你一块地里面可能是上一任租户留下的垃圾未初始化。calloc是精装修分配完自动清零适合数组初始化但稍微慢那么一丢丢。realloc最骚如果原地空间够它就在原地扩不够的话它偷偷找个新地方把旧东西搬过去旧地址就废了。你要是还拿着旧指针操作恭喜你野指针诞生。内存对齐为什么结构体大小不等于成员大小之和这题我愿称为面试装X题。面试官问这个通常是想看看你有没有底层优化意识。举个栗子structExample{chara;// 1字节intb;// 4字节charc;// 1字节};你猜sizeof(struct Example)是多少不是6大概率是12在32位系统上。为啥因为CPU读内存是按块读的一次4字节或8字节。如果int b紧挨着char a放那b就跨了两个块CPU得读两次再拼接性能直接砍半。所以编译器会在a后面塞3个空字节padding让b从4的倍数地址开始。这就像你搬家虽然你的书char只占一点儿地方但为了后面的大沙发int能正对门放对齐你得在前面留出走道空间。面试技巧结构体内存压缩方法如果真被问到结构体怎么压缩你就说**“调整成员顺序把大类型放前面”**比如structOptimized{intb;// 4字节chara;// 1字节charc;// 1字节// 最后补2字节对齐到4};// 总共8字节省了4个这一说面试官就知道你懂内存布局优化不是只会写LeetCode的书呆子。结构体面向对象的祖师爷别看C语言不是面向对象但结构体函数指针硬生生能模拟出类的味道。很多面试官就是搞底层的就爱问这种用C实现面向对象特性的开放题。柔性数组结构体的最后一招这是C99的标准特性但很多人不知道。柔性数组Flexible Array Member就是结构体最后一个成员可以写成char data[]大小不确定。有啥用比如你要搞个网络协议包structPacket{intlength;chardata[];// 柔性数组不占sizeof空间};你可以malloc(sizeof(Packet) payload_size)一次性把头部和数据都分配了内存连续缓存友好还省了一次指针跳转。这比char *data再单独malloc的方案性能高到不知道哪里去了。面试时提到这个属于知道的人不多但用的人都说香的知识点印象分直接拉满。位域Bit-field把一个字节掰成八瓣用嵌入式面试必考。当你内存抠到字节都不够用时位域能让你指定一个成员占几个bitstructFlags{unsignedintis_active:1;// 只占1位unsignedintpriority:3;// 占3位0-7unsignedint:4;// 填充4位对齐用};这就像你住群租房本来一个房间住1人1字节现在硬是用隔断隔成8个床位8个bit每个床位住1个人0或1。注意坑点位域的顺序和内存布局是编译器相关的不同编译器可能反过来移植性差。面试时说完优点一定要补一句但位域不利于移植跨平台得谨慎显得你考虑周全。实战面试话术怎么把简单题答出高级感最后说几个我观察到的面试套路被问指针和引用有什么区别时别只说指针可变引用不可变。你得说“指针可以是NULL引用必须初始化指针能指向不同对象引用绑定后不能改sizeof指针是地址长度sizeof引用是原对象大小。”一套组合拳下来面试官就知道你确实写过代码不是背的八股文。被问内存泄漏怎么排查时别只说用valgrind。你可以说“小项目我自己封装malloc/free计数大项目用AddressSanitizer或者valgrind嵌入式没工具就靠代码审查malloc和free必须配对而且free后指针置NULL防野指针。”这展示了你不同场景下的应对能力。*被问const charp和char * const p的区别时画个图或者用手势比划const在左边是指向的内容不能改地址里的值固定const在右边是指针本身不能改只能指向这儿不能指向别处。形象记忆法面试官听得也轻松。说到底C语言面试考的其实不是语法是你对内存Ownership的理解。谁分配谁释放指针生命周期管理这些思维迁移到Rust就是Ownership系统迁移到Go就是GC调优迁移到AI工程就是显存管理CUDA里的malloc/free比CPU刺激多了显存泄漏直接炸机。所以啊别觉得C语言老古董。把这三大块啃透了再去学那些新语言你会发现大部分高级特性底层都是这些老套路的封装。面试时拿出这份底气offer自然手到擒来。目前国内还是很缺AI人才的希望更多人能真正加入到AI行业共同促进行业进步增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow教程通俗易懂高中生都能看懂还有各种段子风趣幽默从深度学习基础原理到各领域实战应用都有讲解我22年的AI积累全在里面了。注意教程仅限真正想入门AI的朋友否则看看零散的博文就够了。

更多文章