2025年高頻常見c面試題及答案_第1頁(yè)
2025年高頻常見c面試題及答案_第2頁(yè)
2025年高頻常見c面試題及答案_第3頁(yè)
2025年高頻常見c面試題及答案_第4頁(yè)
2025年高頻常見c面試題及答案_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2025年高頻常見c面試題及答案指針和數(shù)組的本質(zhì)區(qū)別在于:指針是一個(gè)獨(dú)立變量,存儲(chǔ)內(nèi)存地址;數(shù)組名是常量,代表數(shù)組首元素地址且不可修改。例如,`intarr[5]={1,2,3,4,5};intp=arr;`中,`arr`是常量地址,`p`是變量。當(dāng)數(shù)組作為函數(shù)參數(shù)傳遞時(shí)會(huì)退化為指針,此時(shí)無法用`sizeof`獲取原數(shù)組大小。如`voidfunc(intarr[]){printf("%zu",sizeof(arr));}`中,`sizeof(arr)`返回指針大?。ㄍǔ?字節(jié)),而主函數(shù)中`sizeof(arr)`返回20字節(jié)(5×4)。malloc、calloc、realloc的核心區(qū)別:malloc分配指定字節(jié)的連續(xù)內(nèi)存,不初始化;calloc分配`n×size`字節(jié)內(nèi)存并初始化為0;realloc調(diào)整現(xiàn)有內(nèi)存塊大小,可能移動(dòng)內(nèi)存位置。使用realloc需注意:若原指針為NULL,等同于malloc;若新大小為0,等同于free(需注意不同平臺(tái)行為差異);應(yīng)使用臨時(shí)變量接收返回值,避免原指針丟失導(dǎo)致內(nèi)存泄漏。例如:`intp=malloc(10sizeof(int));inttmp=realloc(p,20sizeof(int));if(tmp)p=tmp;elsefree(p);`野指針的成因主要有三種:未初始化的指針(如`intp;p=10;`)、已釋放內(nèi)存的指針(如`free(p);p=20;`)、超出作用域的局部變量指針(如`intget_ptr(){inta=5;return&a;}`)。避免方法:指針聲明時(shí)初始化為NULL;釋放內(nèi)存后立即置NULL;不返回局部變量地址。示例代碼:```cintp=NULL;//初始化p=malloc(sizeof(int));if(p){p=10;}free(p);p=NULL;//釋放后置NULL,避免懸垂指針```結(jié)構(gòu)體對(duì)齊規(guī)則:成員按自身大小對(duì)齊(對(duì)齊數(shù)為成員類型大小與編譯器默認(rèn)對(duì)齊數(shù)的較小值);結(jié)構(gòu)體整體對(duì)齊數(shù)為所有成員對(duì)齊數(shù)的最大值;總大小需是整體對(duì)齊數(shù)的整數(shù)倍。例如,結(jié)構(gòu)體`structS{chara;intb;shortc;}`,假設(shè)默認(rèn)對(duì)齊數(shù)為4:`a`(1字節(jié))對(duì)齊到0偏移,占0;`b`(4字節(jié))需對(duì)齊到4的倍數(shù),故0+1后填充3字節(jié),`b`占4-7;`c`(2字節(jié))對(duì)齊到2的倍數(shù),7+1=8,`c`占8-9;整體對(duì)齊數(shù)為4,總大小需是4的倍數(shù),故填充到12字節(jié)(9+3)。define與inline函數(shù)對(duì)比:宏在預(yù)處理階段展開,無函數(shù)調(diào)用開銷,但無類型檢查,可能因副作用導(dǎo)致錯(cuò)誤(如`defineMAX(a,b)((a)>(b)?(a):(b))`中`MAX(i++,j++)`會(huì)重復(fù)自增);inline函數(shù)在編譯階段展開,有類型檢查,更安全。適合用宏的場(chǎng)景:簡(jiǎn)單運(yùn)算(如位操作`defineSET_BIT(x,n)((x)|=(1<<(n)))`)、類型無關(guān)的通用代碼(需注意參數(shù)保護(hù))。避免頭文件重復(fù)包含的方法:1.傳統(tǒng)`ifndef`:`ifndef_HEADER_H_define_HEADER_H_...endif`;2.C++11起支持`pragmaonce`(部分C編譯器如GCC也支持);3.編譯器擴(kuò)展(如MSVC的`pragmaonce`)。`ifndef`兼容性更好,`pragmaonce`效率更高(無需多次檢查宏定義)。const關(guān)鍵字用于修飾變量或指針,表明其值不可被直接修改。`constcharp`(常量字符指針):指針指向的內(nèi)容不可改,指針本身可改;`charconstp`(同前者,寫法不同);`charconstp`(字符常量指針):指針本身不可改,指向的內(nèi)容可改;`constcharconstp`:指針和指向內(nèi)容均不可改。例如:```ccharstr[]="test";constcharp1=str;//p1='a'錯(cuò)誤,p1=str+1正確charconstp2=str;//p2=str+1錯(cuò)誤,p2='a'正確```安全的strcpy需考慮:源字符串是否為空(NULL)、目標(biāo)緩沖區(qū)是否足夠大(需手動(dòng)檢查長(zhǎng)度)、內(nèi)存重疊(如目標(biāo)在源之后且有重疊)。優(yōu)化實(shí)現(xiàn):```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;}```內(nèi)存泄漏的常見場(chǎng)景:動(dòng)態(tài)分配后未調(diào)用free(如`malloc`后忘記`free`)、函數(shù)中途返回未釋放(如`if(error)return;`前未釋放已分配內(nèi)存)、指針被覆蓋導(dǎo)致無法訪問(如`p=malloc(10);p=malloc(20);`丟失第一次分配的指針)。檢測(cè)方法:工具(Valgrind的`--leak-check=full`、DrMemory)、手動(dòng)在關(guān)鍵位置記錄分配/釋放次數(shù)(如用宏包裝malloc/free,統(tǒng)計(jì)計(jì)數(shù))。工程預(yù)防:使用RAII思想(如用`__attribute__((cleanup))`自動(dòng)釋放)、限制動(dòng)態(tài)分配作用域、代碼審查時(shí)重點(diǎn)檢查資源管理。函數(shù)指針用于存儲(chǔ)函數(shù)的入口地址,可實(shí)現(xiàn)回調(diào)機(jī)制(如事件處理、算法解耦)。例如,排序函數(shù)中通過函數(shù)指針指定比較規(guī)則:```cintcompare_int(constvoida,constvoidb){return((int)a(int)b);}voidsort_array(intarr,size_tlen,int(cmp)(constvoid,constvoid)){//實(shí)現(xiàn)排序,調(diào)用cmp比較元素}//使用:sort_array(arr,5,compare_int);```聯(lián)合體與結(jié)構(gòu)體的內(nèi)存分配差異:聯(lián)合體所有成員共享同一塊內(nèi)存(大小為最大成員的大小),結(jié)構(gòu)體成員按順序分配(需考慮對(duì)齊)。使用聯(lián)合體需注意:同一時(shí)間只有一個(gè)成員有效,修改一個(gè)成員會(huì)覆蓋其他成員的值。例如:```cunionU{inti;floatf;};unionUu;u.i=0x41480000;//二進(jìn)制對(duì)應(yīng)float的12.5printf("%f",u.f);//輸出12.5(需符合IEEE754規(guī)則)```位域用于在結(jié)構(gòu)體中按位分配內(nèi)存,減少空間占用。定義規(guī)則:成員類型需是`int`、`unsignedint`或`signedint`(C99支持_Bool);位域?qū)挾炔荒艹^類型的位寬;無名位域(如`unsigned:4;`)用于填充;不能取位域的地址(&)。示例:```cstructFlags{unsignedintvalid:1;//1位unsignedinterror:2;//2位unsignedint:4;//填充4位};//總大小為1+2+4=7位,對(duì)齊后占1字節(jié)(若編譯器默認(rèn)對(duì)齊數(shù)為1)或4字節(jié)(默認(rèn)對(duì)齊數(shù)為4)```預(yù)處理階段的操作:宏替換、文件包含、條件編譯、刪除注釋。`include<>`從系統(tǒng)頭文件目錄查找(如/usr/include),`include""`先從當(dāng)前目錄查找,再查系統(tǒng)目錄。例如,標(biāo)準(zhǔn)庫(kù)頭文件用`<>`(如`include<stdio.h>`),自定義頭文件用`""`(如`include"myheader.h"`)。遞歸函數(shù)的優(yōu)點(diǎn):代碼簡(jiǎn)潔(如樹遍歷、階乘計(jì)算),符合數(shù)學(xué)歸納法;缺點(diǎn):每次調(diào)用產(chǎn)生棧幀,可能導(dǎo)致棧溢出(如遞歸深度過大),效率可能低于迭代(函數(shù)調(diào)用開銷)。棧溢出場(chǎng)景:計(jì)算大n的階乘(如n=10000)、無限遞歸(如`voidf(){f();}`)。優(yōu)化方法:尾遞歸優(yōu)化(部分編譯器支持,將遞歸轉(zhuǎn)為循環(huán))、手動(dòng)用棧模擬遞歸過程。volatile關(guān)鍵字告知編譯器變量可能被意外修改(如硬件寄存器、多線程共享變量),禁止編譯器優(yōu)化掉對(duì)該變量的讀寫操作。嵌入式開發(fā)中,硬件寄存器的值可能被外設(shè)自動(dòng)修改(如定時(shí)器計(jì)數(shù)器),若不用volatile,編譯器可能認(rèn)為`while(reg==0);`是死循環(huán)而優(yōu)化掉,導(dǎo)致無法檢測(cè)到寄存器值的變化。C11主要新特性:1.`_Static_assert`:編譯時(shí)斷言(如`_Static_assert(sizeof(int)==4,"intmustbe4bytes");`),用于在編譯階段檢查條件;2.泛型選擇(`_Generic`):根據(jù)表達(dá)式類型選擇不同代碼分支(如`_Generic(x,int:1,float:2)`),實(shí)現(xiàn)簡(jiǎn)單泛型;3.多線程支持庫(kù)(`threads.h`):提供`thrd_create`、`mtx_lock`等函數(shù),簡(jiǎn)化多線程編程(盡管實(shí)際中仍常用pthread)。檢測(cè)大端/小端序的函數(shù):```cintcheck_endian(){intnum=1;charp=(char)#return(p==1)?1:0;//1為小端,0為大端}```原理:小端序中,低字節(jié)存放在低地址(如int0x00000001的低地址存0x01),大端序則低地址存0x00。數(shù)組名與指針等價(jià)的情況:當(dāng)數(shù)組名作為右值(如`intp=arr;`)或作為函數(shù)參數(shù)傳遞時(shí)(退化為指針)。不等價(jià)的情況:`sizeof(arr)`返回?cái)?shù)組總大?。ǚ侵羔槾笮。琡&arr`返回?cái)?shù)組指針(類型為`int()[5]`,而`&p`為`int`)。例如:```cintarr[5];intp=arr;printf("%zu%zu",sizeof(arr),sizeof(p));//輸出208(假設(shè)int占4字節(jié))```空間復(fù)雜度O(1)的字符串反轉(zhuǎn)函數(shù):```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--;}}```棧溢出與堆溢出的區(qū)別:棧溢出由函數(shù)調(diào)用棧超過系統(tǒng)限制(如遞歸過深、局部變量過大),堆溢出由動(dòng)態(tài)內(nèi)存操作越界(如`strcpy`到過小的緩沖區(qū))。危害:棧溢出可能導(dǎo)致程序崩潰或任意代碼執(zhí)行(如覆蓋返回地址),堆溢出可能破壞堆管理結(jié)構(gòu)(如覆蓋相鄰塊的大小字段),導(dǎo)致后續(xù)分配/釋放錯(cuò)誤。多文件編程中避免全局變量重復(fù)定義的方法:在頭文件中用`extern`聲明(如`externintglobal_var;`),在源文件中定義一次(如`intglobal_var=0;`)。`extern`用于聲明變量(不分配內(nèi)存),`static`修飾全局變量時(shí)限制其作用域?yàn)楫?dāng)前文件(避免與其他文件同名變量沖突)。處理內(nèi)存重疊的memcpy實(shí)現(xiàn):```cvoidmy_memcpy(voiddest,constvoidsrc,size_tn){if(dest==NULL||src==NULL)returnNULL;chard=(char)dest;constchars=(constchar)src;if(d>s&&d<s+n){//內(nèi)存重疊(dest在src之后且有重疊)d+=n1;s+=n1;while(n--)d-=s--;}else{//正常復(fù)制while(n--)d++=s++;}returndest;}```快速排序基本思想:選擇基準(zhǔn)值(pivot),將數(shù)組分為小于/大于基準(zhǔn)的兩部分,遞歸排序子數(shù)組。遞歸實(shí)現(xiàn)及時(shí)間復(fù)雜度:```cvoidquick_sort(intarr,intleft,intright){if(left>=right)return;intpivot=arr[left];//選擇左端點(diǎn)為基準(zhǔn)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];//交換基準(zhǔn)到正確位置arr[i]=pivot;quick_sort(arr,left,i-1);quick_sort(arr,i+1,right);}//平均時(shí)間復(fù)雜度O(nlogn),最壞O(n2)(已排序數(shù)組且選左端點(diǎn)為基準(zhǔn))```枚舉類型用于定義命名常量,相比`define`的優(yōu)勢(shì):有類型檢查(如`enumColor{RED,GREEN};enumColorc=10;`會(huì)警告,而`defineRED0;intc=10;`無警告)、調(diào)試時(shí)顯示枚舉名(而非數(shù)值)、代碼可讀性更好(如`if(c==RED)`比`if(c==0)`清晰)。指針數(shù)組與數(shù)組指針的區(qū)別:指針數(shù)組是數(shù)組,元素為指針(定義:`intarr[5];`,每個(gè)元素是`int`);數(shù)組指針是指針,指向數(shù)組(定義:`int(p)[5];`,`p`指向一個(gè)包含5個(gè)int的數(shù)組)。示例:```cinta[5]={1,2,3,4,5};intarr[5];//指針數(shù)組,每個(gè)元素指向intint(p)[5]=&a;//數(shù)組指針,p指向a(類型為int[5])```懸空指針(DanglingPointer)指指向已釋放

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論