版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年高频常见c面试题及答案指针和数组的本质区别在于:指针是一个独立变量,存储内存地址;数组名是常量,代表数组首元素地址且不可修改。例如,`intarr[5]={1,2,3,4,5};intp=arr;`中,`arr`是常量地址,`p`是变量。当数组作为函数参数传递时会退化为指针,此时无法用`sizeof`获取原数组大小。如`voidfunc(intarr[]){printf("%zu",sizeof(arr));}`中,`sizeof(arr)`返回指针大小(通常8字节),而主函数中`sizeof(arr)`返回20字节(5×4)。malloc、calloc、realloc的核心区别:malloc分配指定字节的连续内存,不初始化;calloc分配`n×size`字节内存并初始化为0;realloc调整现有内存块大小,可能移动内存位置。使用realloc需注意:若原指针为NULL,等同于malloc;若新大小为0,等同于free(需注意不同平台行为差异);应使用临时变量接收返回值,避免原指针丢失导致内存泄漏。例如:`intp=malloc(10sizeof(int));inttmp=realloc(p,20sizeof(int));if(tmp)p=tmp;elsefree(p);`野指针的成因主要有三种:未初始化的指针(如`intp;p=10;`)、已释放内存的指针(如`free(p);p=20;`)、超出作用域的局部变量指针(如`intget_ptr(){inta=5;return&a;}`)。避免方法:指针声明时初始化为NULL;释放内存后立即置NULL;不返回局部变量地址。示例代码:```cintp=NULL;//初始化p=malloc(sizeof(int));if(p){p=10;}free(p);p=NULL;//释放后置NULL,避免悬垂指针```结构体对齐规则:成员按自身大小对齐(对齐数为成员类型大小与编译器默认对齐数的较小值);结构体整体对齐数为所有成员对齐数的最大值;总大小需是整体对齐数的整数倍。例如,结构体`structS{chara;intb;shortc;}`,假设默认对齐数为4:`a`(1字节)对齐到0偏移,占0;`b`(4字节)需对齐到4的倍数,故0+1后填充3字节,`b`占4-7;`c`(2字节)对齐到2的倍数,7+1=8,`c`占8-9;整体对齐数为4,总大小需是4的倍数,故填充到12字节(9+3)。define与inline函数对比:宏在预处理阶段展开,无函数调用开销,但无类型检查,可能因副作用导致错误(如`defineMAX(a,b)((a)>(b)?(a):(b))`中`MAX(i++,j++)`会重复自增);inline函数在编译阶段展开,有类型检查,更安全。适合用宏的场景:简单运算(如位操作`defineSET_BIT(x,n)((x)|=(1<<(n)))`)、类型无关的通用代码(需注意参数保护)。避免头文件重复包含的方法:1.传统`ifndef`:`ifndef_HEADER_H_define_HEADER_H_...endif`;2.C++11起支持`pragmaonce`(部分C编译器如GCC也支持);3.编译器扩展(如MSVC的`pragmaonce`)。`ifndef`兼容性更好,`pragmaonce`效率更高(无需多次检查宏定义)。const关键字用于修饰变量或指针,表明其值不可被直接修改。`constcharp`(常量字符指针):指针指向的内容不可改,指针本身可改;`charconstp`(同前者,写法不同);`charconstp`(字符常量指针):指针本身不可改,指向的内容可改;`constcharconstp`:指针和指向内容均不可改。例如:```ccharstr[]="test";constcharp1=str;//p1='a'错误,p1=str+1正确charconstp2=str;//p2=str+1错误,p2='a'正确```安全的strcpy需考虑:源字符串是否为空(NULL)、目标缓冲区是否足够大(需手动检查长度)、内存重叠(如目标在源之后且有重叠)。优化实现:```ccharsafe_strcpy(chardest,constcharsrc,size_tdest_size){if(dest==NULL||src==NULL||dest_size==0)returnNULL;size_tsrc_len=strlen(src);if(src_len>=dest_size){//防止溢出dest[0]='\0';returnNULL;}charret=dest;while((dest++=src++)!='\0');returnret;}```内存泄漏的常见场景:动态分配后未调用free(如`malloc`后忘记`free`)、函数中途返回未释放(如`if(error)return;`前未释放已分配内存)、指针被覆盖导致无法访问(如`p=malloc(10);p=malloc(20);`丢失第一次分配的指针)。检测方法:工具(Valgrind的`--leak-check=full`、DrMemory)、手动在关键位置记录分配/释放次数(如用宏包装malloc/free,统计计数)。工程预防:使用RAII思想(如用`__attribute__((cleanup))`自动释放)、限制动态分配作用域、代码审查时重点检查资源管理。函数指针用于存储函数的入口地址,可实现回调机制(如事件处理、算法解耦)。例如,排序函数中通过函数指针指定比较规则:```cintcompare_int(constvoida,constvoidb){return((int)a(int)b);}voidsort_array(intarr,size_tlen,int(cmp)(constvoid,constvoid)){//实现排序,调用cmp比较元素}//使用:sort_array(arr,5,compare_int);```联合体与结构体的内存分配差异:联合体所有成员共享同一块内存(大小为最大成员的大小),结构体成员按顺序分配(需考虑对齐)。使用联合体需注意:同一时间只有一个成员有效,修改一个成员会覆盖其他成员的值。例如:```cunionU{inti;floatf;};unionUu;u.i=0x41480000;//二进制对应float的12.5printf("%f",u.f);//输出12.5(需符合IEEE754规则)```位域用于在结构体中按位分配内存,减少空间占用。定义规则:成员类型需是`int`、`unsignedint`或`signedint`(C99支持_Bool);位域宽度不能超过类型的位宽;无名位域(如`unsigned:4;`)用于填充;不能取位域的地址(&)。示例:```cstructFlags{unsignedintvalid:1;//1位unsignedinterror:2;//2位unsignedint:4;//填充4位};//总大小为1+2+4=7位,对齐后占1字节(若编译器默认对齐数为1)或4字节(默认对齐数为4)```预处理阶段的操作:宏替换、文件包含、条件编译、删除注释。`include<>`从系统头文件目录查找(如/usr/include),`include""`先从当前目录查找,再查系统目录。例如,标准库头文件用`<>`(如`include<stdio.h>`),自定义头文件用`""`(如`include"myheader.h"`)。递归函数的优点:代码简洁(如树遍历、阶乘计算),符合数学归纳法;缺点:每次调用产生栈帧,可能导致栈溢出(如递归深度过大),效率可能低于迭代(函数调用开销)。栈溢出场景:计算大n的阶乘(如n=10000)、无限递归(如`voidf(){f();}`)。优化方法:尾递归优化(部分编译器支持,将递归转为循环)、手动用栈模拟递归过程。volatile关键字告知编译器变量可能被意外修改(如硬件寄存器、多线程共享变量),禁止编译器优化掉对该变量的读写操作。嵌入式开发中,硬件寄存器的值可能被外设自动修改(如定时器计数器),若不用volatile,编译器可能认为`while(reg==0);`是死循环而优化掉,导致无法检测到寄存器值的变化。C11主要新特性:1.`_Static_assert`:编译时断言(如`_Static_assert(sizeof(int)==4,"intmustbe4bytes");`),用于在编译阶段检查条件;2.泛型选择(`_Generic`):根据表达式类型选择不同代码分支(如`_Generic(x,int:1,float:2)`),实现简单泛型;3.多线程支持库(`threads.h`):提供`thrd_create`、`mtx_lock`等函数,简化多线程编程(尽管实际中仍常用pthread)。检测大端/小端序的函数:```cintcheck_endian(){intnum=1;charp=(char)#return(p==1)?1:0;//1为小端,0为大端}```原理:小端序中,低字节存放在低地址(如int0x00000001的低地址存0x01),大端序则低地址存0x00。数组名与指针等价的情况:当数组名作为右值(如`intp=arr;`)或作为函数参数传递时(退化为指针)。不等价的情况:`sizeof(arr)`返回数组总大小(非指针大小),`&arr`返回数组指针(类型为`int()[5]`,而`&p`为`int`)。例如:```cintarr[5];intp=arr;printf("%zu%zu",sizeof(arr),sizeof(p));//输出208(假设int占4字节)```空间复杂度O(1)的字符串反转函数:```cvoidreverse_string(charstr){if(str==NULL)return;charstart=str;charend=str+strlen(str)1;while(start<end){chartmp=start;start=end;end=tmp;start++;end--;}}```栈溢出与堆溢出的区别:栈溢出由函数调用栈超过系统限制(如递归过深、局部变量过大),堆溢出由动态内存操作越界(如`strcpy`到过小的缓冲区)。危害:栈溢出可能导致程序崩溃或任意代码执行(如覆盖返回地址),堆溢出可能破坏堆管理结构(如覆盖相邻块的大小字段),导致后续分配/释放错误。多文件编程中避免全局变量重复定义的方法:在头文件中用`extern`声明(如`externintglobal_var;`),在源文件中定义一次(如`intglobal_var=0;`)。`extern`用于声明变量(不分配内存),`static`修饰全局变量时限制其作用域为当前文件(避免与其他文件同名变量冲突)。处理内存重叠的memcpy实现:```cvoidmy_memcpy(voiddest,constvoidsrc,size_tn){if(dest==NULL||src==NULL)returnNULL;chard=(char)dest;constchars=(constchar)src;if(d>s&&d<s+n){//内存重叠(dest在src之后且有重叠)d+=n1;s+=n1;while(n--)d-=s--;}else{//正常复制while(n--)d++=s++;}returndest;}```快速排序基本思想:选择基准值(pivot),将数组分为小于/大于基准的两部分,递归排序子数组。递归实现及时间复杂度:```cvoidquick_sort(intarr,intleft,intright){if(left>=right)return;intpivot=arr[left];//选择左端点为基准inti=left,j=right;while(i<j){while(i<j&&arr[j]>=pivot)j--;while(i<j&&arr[i]<=pivot)i++;if(i<j){inttmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}}arr[left]=arr[i];//交换基准到正确位置arr[i]=pivot;quick_sort(arr,left,i-1);quick_sort(arr,i+1,right);}//平均时间复杂度O(nlogn),最坏O(n²)(已排序数组且选左端点为基准)```枚举类型用于定义命名常量,相比`define`的优势:有类型检查(如`enumColor{RED,GREEN};enumColorc=10;`会警告,而`defineRED0;intc=10;`无警告)、调试时显示枚举名(而非数值)、代码可读性更好(如`if(c==RED)`比`if(c==0)`清晰)。指针数组与数组指针的区别:指针数组是数组,元素为指针(定义:`intarr[5];`,每个元素是`int`);数组指针是指针,指向数组(定义:`int(p)[5];`,`p`指向一个包含5个int的数组)。示例:```cinta[5]={1,2,3,4,5};intarr[5];//指针数组,每个元素指向intint(p)[5]=&a;//数组指针,p指向a(类型为int[5])```悬空指针(DanglingPointer)指指向已释放
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 旅行活动策划方案6(3篇)
- 生日活动策划方案评价(3篇)
- 红色儿歌活动方案策划(3篇)
- 2025年企业财务管理与成本分析
- 2025年高职园林(园林工程造价)试题及答案
- 2025年中职工程计价管理(管理技术)试题及答案
- 2025年高职食品科学与工程技术(食品加工工艺)试题及答案
- 2025年大学广播电视编导(广播电视编导)试题及答案
- 2025年大学(中西医临床医学)中西医结合信息学试题及答案
- 2025年高职(宠物临床诊疗技术)宠物疾病诊断阶段测试题及答案
- 2026年宁夏贺兰工业园区管委会工作人员社会化公开招聘备考题库带答案详解
- 房地产售后服务及质量保证措施
- 国有企业采购管理规范 T/CFLP 0027-2020
- 国开2023年企业法务形考任务1-4答案
- 感应加热器安全操作规程
- 商业地产行业商业地产投资机会
- 两轮车控制器行业报告
- JSA临时用电作业安全分析表
- 2015-2022年北京卫生职业学院高职单招语文/数学/英语笔试参考题库含答案解析
- 赛肤润常见临床应用2010年
- 提高铝模板施工质量合格率
评论
0/150
提交评论