版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
高頻c語言常見面試題及答案C語言中,`sizeof`和`strlen`的區(qū)別是什么?`sizeof`是運(yùn)算符,用于計(jì)算數(shù)據(jù)類型或變量在內(nèi)存中占用的字節(jié)數(shù),編譯時(shí)確定結(jié)果;`strlen`是標(biāo)準(zhǔn)庫函數(shù),用于計(jì)算字符串的實(shí)際長度(不包含末尾的空字符'\0'),運(yùn)行時(shí)逐個(gè)字符遍歷直到遇到'\0'。例如,`chararr[]="test";`中,`sizeof(arr)`結(jié)果為5(包含'\0'),`strlen(arr)`結(jié)果為4。若`charp="test";`,`sizeof(p)`在32位系統(tǒng)是4字節(jié)(指針大?。琡strlen(p)`仍為4。`const`關(guān)鍵字有哪些常見用法?`const`用于修飾變量時(shí),表示變量值不可修改(本質(zhì)是只讀,非真正常量),如`constinta=10;`。修飾指針時(shí),`constintp`表示指針指向的內(nèi)容不可變(常量指針),`intconstp`表示指針本身地址不可變(指針常量),`constintconstp`表示指針地址和指向內(nèi)容均不可變。修飾函數(shù)參數(shù)時(shí),如`voidfunc(constintp)`,防止函數(shù)內(nèi)部修改指針指向的數(shù)據(jù),提高代碼安全性。修飾類成員函數(shù)時(shí)(C++特性),表示該函數(shù)不修改類的成員變量,但C語言無類概念,此場景僅適用于C++擴(kuò)展。`static`關(guān)鍵字在C語言中的作用有哪些?在函數(shù)內(nèi)部修飾變量時(shí),變量存儲在靜態(tài)存儲區(qū),僅初始化一次,生命周期持續(xù)到程序結(jié)束,函數(shù)多次調(diào)用時(shí)變量值保留上次結(jié)果。例如:```cvoidfunc(){staticintcount=0;count++;printf("%d",count);}```每次調(diào)用`func()`都會(huì)輸出遞增的數(shù)值。在文件作用域修飾變量或函數(shù)時(shí),變量/函數(shù)的作用域限制在當(dāng)前文件內(nèi),其他文件無法通過`extern`聲明訪問,避免全局命名沖突。例如,`staticintglobal=10;`只能在當(dāng)前文件使用,而普通全局變量可被其他文件訪問。指針和數(shù)組的區(qū)別是什么?數(shù)組名是指向首元素的常量指針(地址不可修改),而指針是變量(可重新賦值)。例如,`intarr[5];arr++`會(huì)編譯錯(cuò)誤(數(shù)組名是常量),而`intp=arr;p++`合法。數(shù)組的大小在編譯時(shí)確定(`sizeof(arr)`得到整個(gè)數(shù)組的大?。?,指針的大小是系統(tǒng)指針長度(32位4字節(jié),64位8字節(jié))。數(shù)組作為參數(shù)傳遞時(shí)會(huì)退化為指針,丟失大小信息,因此函數(shù)內(nèi)部無法通過`sizeof`獲取數(shù)組實(shí)際長度。野指針是如何產(chǎn)生的?如何避免?野指針指指向無效內(nèi)存地址的指針,常見原因:指針未初始化(直接使用未賦值的指針)、指針指向的內(nèi)存被釋放后未置空(懸空指針)、指針越界訪問(指向數(shù)組外的內(nèi)存)。避免方法:指針聲明時(shí)初始化為`NULL`;內(nèi)存釋放后將指針置為`NULL`;動(dòng)態(tài)分配內(nèi)存后檢查是否分配成功(`malloc`可能返回`NULL`);使用指針前判斷是否為`NULL`;避免返回局部變量的地址(局部變量生命周期結(jié)束后內(nèi)存被回收)。`malloc`/`free`和`new`/`delete`的區(qū)別是什么?(注:`new`/`delete`是C++關(guān)鍵字,C語言不支持,但面試中常對比)`malloc`/`free`是C標(biāo)準(zhǔn)庫函數(shù),`new`/`delete`是C++運(yùn)算符。`malloc`分配的是未初始化的內(nèi)存(返回`void`需強(qiáng)制轉(zhuǎn)換),`new`會(huì)調(diào)用構(gòu)造函數(shù)初始化對象;`free`僅釋放內(nèi)存,`delete`會(huì)調(diào)用析構(gòu)函數(shù)。`malloc`分配失敗返回`NULL`,`new`默認(rèn)拋出異常(可通過`nothrow`參數(shù)返回`NULL`)。C語言中只能使用`malloc`/`free`管理動(dòng)態(tài)內(nèi)存。結(jié)構(gòu)體和聯(lián)合體的區(qū)別是什么?結(jié)構(gòu)體(`struct`)中各成員擁有獨(dú)立的內(nèi)存空間,總大小是各成員大小之和(需考慮內(nèi)存對齊);聯(lián)合體(`union`)所有成員共享同一塊內(nèi)存空間,總大小是最大成員的大?。ㄍ瑯有鑳?nèi)存對齊)。例如:```cstructS{inta;charb;};//大小通常為8(int4+char1+3填充)unionU{inta;charb;};//大小為4(與int對齊)```結(jié)構(gòu)體用于存儲不同時(shí)使用的多個(gè)數(shù)據(jù),聯(lián)合體用于節(jié)省內(nèi)存,同一時(shí)間只有一個(gè)成員有效。內(nèi)存對齊的作用是什么?如何計(jì)算結(jié)構(gòu)體大???內(nèi)存對齊是為了提高CPU訪問效率(CPU通常按字長訪問內(nèi)存,非對齊數(shù)據(jù)需多次訪問),同時(shí)滿足某些硬件平臺的限制(如ARM不允許訪問未對齊的內(nèi)存)。計(jì)算結(jié)構(gòu)體大小需遵循:每個(gè)成員的起始地址是其類型大小的整數(shù)倍;結(jié)構(gòu)體總大小是所有成員中最大對齊數(shù)的整數(shù)倍。例如:```cstructA{charc;//1字節(jié),起始地址0inti;//4字節(jié),需對齊到4的倍數(shù),起始地址4(填充3字節(jié))shorts;//2字節(jié),起始地址8};//最大對齊數(shù)是4,總大小需是4的倍數(shù),8+2=10→填充到12字節(jié)```可用`pragmapack(n)`設(shè)置最大對齊數(shù)(`n`為1、2、4等),此時(shí)成員對齊數(shù)取`min(自身大小,n)`。`define`和`const`的區(qū)別是什么?`define`是預(yù)處理器指令,在編譯前替換,無類型檢查;`const`是關(guān)鍵字,定義只讀變量,有類型檢查更安全。`define`宏可能產(chǎn)生多次求值(如`defineMAX(a,b)((a)>(b)?(a):(b))`,若參數(shù)含自增操作會(huì)導(dǎo)致副作用),`const`變量僅計(jì)算一次。`define`不分配內(nèi)存(除非用于定義常量字符串),`const`變量存儲在數(shù)據(jù)段(全局/靜態(tài))或棧(局部)。`define`可定義宏函數(shù),`const`不能。函數(shù)指針的作用是什么?如何定義?函數(shù)指針指向函數(shù)的入口地址,可用于實(shí)現(xiàn)回調(diào)函數(shù)、函數(shù)表(如狀態(tài)機(jī))等。定義格式:`返回類型(指針名)(參數(shù)類型列表)`。例如,定義指向`intadd(inta,intb)`的函數(shù)指針:```cint(p)(int,int);p=add;//或p=&add(取地址符可選)intres=p(2,3);//調(diào)用方式與原函數(shù)一致```標(biāo)準(zhǔn)庫函數(shù)`qsort`的第四個(gè)參數(shù)即為函數(shù)指針,用于指定排序規(guī)則。棧和堆的區(qū)別是什么?棧由編譯器自動(dòng)管理,存儲局部變量、函數(shù)參數(shù)、返回地址等,空間較?。ㄍǔ譓B),遵循先進(jìn)后出(LIFO)原則,內(nèi)存分配/釋放由系統(tǒng)自動(dòng)完成,效率高。堆由程序員手動(dòng)管理(`malloc`/`free`),空間較大(受限于物理內(nèi)存),分配方式靈活但需手動(dòng)釋放,易出現(xiàn)內(nèi)存泄漏。棧的內(nèi)存地址向下增長(向低地址擴(kuò)展),堆向上增長(向高地址擴(kuò)展)。`volatile`關(guān)鍵字的作用是什么?`volatile`表示變量可能被編譯器未知的因素修改(如硬件寄存器、多線程共享變量),禁止編譯器對該變量進(jìn)行優(yōu)化(如緩存到寄存器、重排指令)。例如,讀取硬件狀態(tài)寄存器時(shí):```cvolatileintstatus=(volatileint)0x1234;intval=status;//編譯器不會(huì)優(yōu)化為讀取一次,確保每次讀取實(shí)際內(nèi)存值```多線程中共享變量若被`volatile`修飾,可保證每次讀取的是最新值(但不保證原子性,需結(jié)合互斥鎖)。`voidmain()`和`intmain(intargc,charargv[])`的區(qū)別是什么?C語言標(biāo)準(zhǔn)規(guī)定`main`函數(shù)返回類型為`int`,`voidmain()`是非標(biāo)準(zhǔn)寫法(僅部分編譯器支持)。`intmain()`表示無命令行參數(shù),`intmain(intargc,charargv[])`用于接收命令行參數(shù):`argc`是參數(shù)個(gè)數(shù)(至少1,`argv[0]`是程序名),`argv`是指向參數(shù)的指針數(shù)組。程序結(jié)束時(shí)返回`int`值(0表示成功,非0表示錯(cuò)誤),供操作系統(tǒng)或父進(jìn)程獲取執(zhí)行結(jié)果。數(shù)組名和指針的聯(lián)系與區(qū)別?數(shù)組名是指向首元素的常量指針(地址不可變),`&arr`表示數(shù)組的地址(類型為`int()[5]`,指向5元素?cái)?shù)組的指針),`arr`和`&arr[0]`等價(jià)(類型為`int`)。指針可指向數(shù)組任意位置,且可修改指向(如`p=arr+2`指向第三個(gè)元素)。數(shù)組作為參數(shù)傳遞時(shí)退化為指針(`voidfunc(intarr[])`等價(jià)于`voidfunc(intarr)`),因此函數(shù)內(nèi)部無法通過`sizeof(arr)`獲取數(shù)組大小,需額外傳遞長度參數(shù)。內(nèi)存泄漏的危害及檢測方法?內(nèi)存泄漏指動(dòng)態(tài)分配的內(nèi)存未釋放,導(dǎo)致可用內(nèi)存逐漸減少,最終可能引發(fā)程序崩潰或系統(tǒng)變慢。長期運(yùn)行的程序(如服務(wù)器)泄漏積累會(huì)導(dǎo)致嚴(yán)重問題。檢測方法:手動(dòng)檢查(代碼中`malloc`后是否有對應(yīng)的`free`,尤其在分支語句中);使用工具(如Linux的`valgrind`、Windows的`DebugCRT庫`),`valgrind`可檢測未釋放的內(nèi)存并定位分配位置;編寫內(nèi)存管理封裝函數(shù)(記錄分配/釋放信息,程序結(jié)束時(shí)檢查是否有未釋放的內(nèi)存)。`switch`語句中`case`后為何需要`break`?`switch`根據(jù)表達(dá)式值跳轉(zhuǎn)到對應(yīng)`case`標(biāo)簽,若沒有`break`會(huì)繼續(xù)執(zhí)行后續(xù)`case`的代碼(穿透現(xiàn)象)。例如:```cintx=2;switch(x){case1:printf("1");case2:printf("2");//x=2時(shí)執(zhí)行此casecase3:printf("3");//無break會(huì)繼續(xù)執(zhí)行}```輸出結(jié)果為`23`。`break`用于終止當(dāng)前`case`的執(zhí)行,跳出`switch`結(jié)構(gòu)。`default`標(biāo)簽處理所有未匹配的情況,可選但建議保留以處理異常。`typedef`和`define`在類型重命名上的區(qū)別?`typedef`是編譯器關(guān)鍵字,用于為類型定義新名稱(有類型檢查),`define`是預(yù)處理器指令,簡單文本替換。例如:```ctypedefintpint;definePINTint````pinta,b;`定義兩個(gè)`int`指針;`PINTa,b;`等價(jià)于`inta,b;`,其中`b`是`int`類型。`typedef`可用于結(jié)構(gòu)體、指針等復(fù)雜類型,`define`可能因替換位置導(dǎo)致錯(cuò)誤。`typedef`更安全,推薦用于類型別名。如何判斷一段內(nèi)存是棧分配還是堆分配?棧內(nèi)存由系統(tǒng)自動(dòng)管理,存儲局部變量、函數(shù)參數(shù)等,生命周期隨函數(shù)調(diào)用結(jié)束而結(jié)束;堆內(nèi)存由`malloc`等函數(shù)分配,需手動(dòng)釋放,生命周期由程序員控制??赏ㄟ^地址范圍判斷(通常堆地址高于棧地址,但不同系統(tǒng)可能不同);或檢查指針是否由`malloc`返回(需記錄分配信息)。例如,局部變量地址通常在函數(shù)調(diào)用時(shí)壓棧,地址較低;堆地址在`malloc`時(shí)從堆區(qū)分配,地址較高。`memcpy`和`memmove`的區(qū)別是什么?`memcpy`和`memmove`均用于內(nèi)存拷貝,原型為`voidmemcpy(voiddest,constvoidsrc,size_tn);`和`voidmemmove(voiddest,constvoidsrc,size_tn);`。`memcpy`假設(shè)源和目標(biāo)內(nèi)存無重疊,直接拷貝;`memmove`處理重疊情況(如`dest`在`src`之后且區(qū)間重疊),會(huì)先將源數(shù)據(jù)復(fù)制到臨時(shí)緩沖區(qū),再拷貝到目標(biāo),保證正確性。例如,`chararr[10]="abcdefgh";memmove(arr+2,arr,5);`會(huì)正確將`"abcde"`復(fù)制到`arr+2`(結(jié)果為`"ababcdeh"`),而`memcpy`可能因重疊導(dǎo)致數(shù)據(jù)覆蓋錯(cuò)誤。位域的作用是什么?如何定義?位域用于在結(jié)構(gòu)體中按位分配內(nèi)存,節(jié)省空間(尤其在嵌入式系統(tǒng)中處理寄存器位操作)。定義格式:`類型成員名:位數(shù);`。例如:```cstructReg{unsignedintflag1:1;//1位unsignedintflag2:2;//2位unsignedintdata:29;//29位(總32位,與unsignedint對齊)};```位域成員類型需是`unsignedint`、`signedint`或`_Bool`(C99),位數(shù)不能超過類型的最大位數(shù)(如`unsignedint`通常32位)。位域不可取地址(`®.flag1`非法),跨平臺時(shí)需注意位順序(大端/小端)。逗號表達(dá)式的運(yùn)算規(guī)則是什么?逗號表達(dá)式按從左到右順序計(jì)算各表達(dá)式,結(jié)果為最后一個(gè)表達(dá)式的值。例如,`inta=(2+3,54,100);`中,先計(jì)算`2+3=5`(無賦值),再`54=20`(無賦值),最后`100`賦值給`a`,最終`a=100`。逗號表達(dá)式常用于for循環(huán)初始化/更新部分,如`for(i=0,j=10;i<j;i++,j--)`。如何實(shí)現(xiàn)一個(gè)函數(shù)交換兩個(gè)整數(shù)的值?錯(cuò)誤方式:```cvoidswap(inta,intb){//值傳遞,交換的是副本inttemp=a;a=b;b=temp;}```正確方式需傳遞指針(地址傳遞):```cvoidswap(inta,intb){inttemp=a;a=b;b=temp;}```調(diào)用時(shí)`swap(&x,&y)`,通過指針修改原變量的值。若使用C++引用,可`voidswap(int&a,int&b)`,但C語言不支持引用,必須用指針。`gets`函數(shù)的危害及替代方案?`gets`從標(biāo)準(zhǔn)輸入讀取字符串,不限制輸入長度,可能導(dǎo)致緩沖區(qū)溢出(輸入超過數(shù)組大小時(shí)覆蓋后續(xù)內(nèi)存),是不安全的函數(shù)(C11已移除)。替代方案:`fgets`(指定最大讀取長度,`fgets(str,sizeof(str),stdin)`),會(huì)保留換行符(需手動(dòng)處理);或`scanf("%[^\n]",str)`(讀取到換行符停止,但仍需限制長度防止溢出)。如何判斷機(jī)器是大端序還是小端序?大端序(網(wǎng)絡(luò)字節(jié)序)高位字節(jié)存放在低地址,小端序低位字節(jié)存放在低地址??赏ㄟ^聯(lián)合體檢測:```cintcheck_endian(){union{inti;charc;}u;u.i=1;return(u.c==1);//小端返回1,大端返回0}````int`類型4字節(jié),若`u.c`(取低地址字節(jié))為1,說明低位在低地址,是小端序。`strcpy`和`strncpy`的區(qū)別是什么?`strcpy`將源字符串(含'\0')復(fù)制到目標(biāo),不檢查目標(biāo)緩沖區(qū)大小,可能溢出;`strncpy`指定復(fù)制的最大字符數(shù)(`n`),若源長度小于`n`,目標(biāo)后填充'\0'直到`n`個(gè)字符;若源長度大于等于`n`,目標(biāo)字符串無'\0'(導(dǎo)致非合法C字符串)。例如:```cchardest[5];strcpy(dest,"hello");//溢出,未定義行為strncpy(dest,"hello",5);//dest內(nèi)容為"hello"(無'\0'),strlen(dest)會(huì)越界```安全使用`strncpy`需手動(dòng)添加'\0':`strncpy(dest,src,n-1);dest[n-1]='\0';`。函數(shù)參數(shù)壓棧順序是怎樣的?C語言函數(shù)參數(shù)壓棧順序是從右到左(不同編譯器可能不同,但常見為右到左)。例如,`func(a,b,c)`先壓`c`,再`b`,最后`a`。這樣設(shè)計(jì)是為了支持可變參數(shù)函數(shù)(如`printf`),通過最左邊的參數(shù)(已知類型)可計(jì)算后續(xù)參數(shù)的位置。壓棧順序由調(diào)用約定決定(如`__cdecl`、`__stdcall`),默認(rèn)通常為`__cdecl`(調(diào)用者清理?xiàng)#?。如何防止頭文件重復(fù)包含?使用頭文件保護(hù)符(`ifndef`/`define`/`endif`):```cifndef_HEADER_H_define_HEADER_H_//頭文件內(nèi)容endif```或C99支持的`pragmaonce`(部分編譯器支持),作用相同但更簡潔。重復(fù)包含會(huì)導(dǎo)致結(jié)構(gòu)體/函數(shù)重復(fù)聲明(編譯錯(cuò)誤),保護(hù)符確保頭文件只編譯一次。`void`指針的特性是什么?`void`是通用指針類型,可指向任意類型的數(shù)據(jù)(無需強(qiáng)制轉(zhuǎn)換),但不能直接解引用(需轉(zhuǎn)換為具體類型)。例如:```cinta=10;voidp=&a;intq=(int)p;//需強(qiáng)制轉(zhuǎn)換printf("%d",q);//正確````void`常用于內(nèi)存分配函數(shù)(`malloc`返回`void`),可賦值給任意類型的指針變量。如何實(shí)現(xiàn)一個(gè)簡單的內(nèi)存池?內(nèi)存池預(yù)先分配大塊內(nèi)存,按需分配小塊,減少`malloc`/`free`調(diào)用次數(shù)(提高效率,減少內(nèi)存碎片)?;静襟E:1.初始化時(shí)分配一塊大內(nèi)存(如`charpool=malloc(POOL_SIZE);`);2.維護(hù)當(dāng)前可用位置指針(`charcurrent=pool;`);3.分配時(shí)檢查剩余空間,若足夠則從`current`處分配,`current+=size;`;4.釋放時(shí)不立即回收(或標(biāo)記為可用),程序結(jié)束時(shí)統(tǒng)一釋放`pool`。適用于需要頻繁分配/釋放相同大小內(nèi)存的場景(如鏈表節(jié)點(diǎn))。`static`局部變量和全局變量的區(qū)別?`static`局部變量存儲在靜態(tài)存儲區(qū)(與全局變量相同),但作用域僅限所在函數(shù),其他函數(shù)不可訪問;全局變量作用域是整個(gè)程序(其他文件可通過`extern`訪問)。`static`局部變量僅初始化一次(編譯時(shí)初始化),全局變量同理。兩者生命周期均為程序運(yùn)行期間。如何判斷兩個(gè)指針是否指向同一塊內(nèi)存?直接比較指針值(`p==q`)即可。若指針指向數(shù)組元素,`p`和`q`需指向同一數(shù)組且在數(shù)組范圍內(nèi);若指向動(dòng)態(tài)分配內(nèi)存,需確保未被釋放(否則比較無意義)。注意,不同內(nèi)存塊可能有相同地址(如不同函數(shù)的局部變量地址可能重疊),但運(yùn)行時(shí)同一時(shí)刻兩個(gè)有效指針指向同地址即表示同一塊內(nèi)存。`printf`如何實(shí)現(xiàn)可變參數(shù)?`printf`使用`<stdarg.h>`頭文件中的宏(`va_list`、`va_start`、`va_arg`、`va_end`)處理可變參數(shù)。函數(shù)原型為`intprintf(constcharformat,...);`,`...`表示可變參數(shù)列表。實(shí)現(xiàn)步驟:1.用`va_list`聲明參數(shù)指針;2.`va_start(ap,format)`初始化指針(指向第一個(gè)可變參數(shù));3.`va_arg(ap,type)`按類型獲取參數(shù);4.`va_end(ap)`結(jié)束參數(shù)處理。例如,簡化版`my_printf`:```cinclude<stdarg.h>voidmy_printf(constcharformat,...){va_listap;va_start(ap,format);//解析format,根據(jù)格式符調(diào)用va_arg獲取參數(shù)va_end(ap);}```需注意參數(shù)類型與格式符匹配(如`%d`對應(yīng)`int`,`%f`對應(yīng)`double`),否則未定義行為。結(jié)構(gòu)體指針訪問成員的兩種方式?結(jié)構(gòu)體指針`p`訪問成員`member`可用`(p).member`或`p->member`(箭頭運(yùn)算符更簡潔)。例如:```cstructNode{intdata;structNodenext;};structNodep=malloc(sizeof(structNode));p->data=10;//等價(jià)于(p).data=10;p->next=NULL;```箭頭運(yùn)算符自動(dòng)解引用指針并訪問成員,避免括號冗余。`const`修飾的變量一定不能被修改嗎?`const`修飾的變量是只讀的,直接修改會(huì)編譯錯(cuò)誤(如`constinta=10;a=20;`),但可通過指針間接修改(未定義行為,依賴編譯器實(shí)現(xiàn))。例如:```cconstinta=10;intp=(int)&a;p=20;//可能成功(如GCC),但修改只讀內(nèi)存可能導(dǎo)致段錯(cuò)誤```不建議此操作,`const`的目的是保證變量不被意外修改,間接修改違反設(shè)計(jì)意圖。`sizeof`對函數(shù)名的處理?`sizeof(函數(shù)名)`在C語言中是未定義行為(C標(biāo)準(zhǔn)未規(guī)定),不同編譯器處理不同。例如,`intfunc(){return0;}`,`sizeof(func)`在GCC中返回1(無實(shí)際意義),但應(yīng)避免此類用法。`sizeof`用于變量或類型,函數(shù)名不是變量,不應(yīng)計(jì)算其大小。如何實(shí)現(xiàn)一個(gè)不使用臨時(shí)變量交換兩個(gè)整數(shù)?算術(shù)法:`a=a+b;b=ab;a=ab;`(可能溢出);異或法:`a=a^b;b=a^b;a=a^b;`(利用異或自反性,`x^x=0`,`x^0=x`)。異或法更安全(無溢出問題),但兩種方法均需注意:若`a`和`b`指向同一塊內(nèi)存(如`swap(&x,&x)`),異或法會(huì)導(dǎo)致結(jié)果為0(`a^a=0`),需額外判斷指針是否相同。`main`函數(shù)執(zhí)行前/后會(huì)執(zhí)行哪些代碼?C語言中,`main`函數(shù)執(zhí)行前會(huì)初始化全局變量、靜態(tài)變量(調(diào)用構(gòu)造函數(shù),C++特性)、執(zhí)行`__attribute__((constructor))`(GCC擴(kuò)展)修飾的函數(shù);執(zhí)行后會(huì)執(zhí)行`atexit`注冊的函數(shù)(`atexit(func)`)、析構(gòu)全局對象(C++)、`__attribute__((destructor))`修飾的函數(shù)。例如:```cinclude<stdio.h>include<stdlib.h>voidpre_main()__attribute__((constructor));voidpre_main(){printf("Beforemain\n");}voidpost_main(){printf("Aftermain\n");}intmain(){atexit(post_main);printf("Inmain\n");return0;}```輸出順序:`Beforemain→Inmain→Aftermain`。如何檢測程序中未初始化的變量?未初始化的局部變量存儲在棧中,其值是隨機(jī)的(垃圾值),使用會(huì)導(dǎo)致未定義行為。檢測方法:開啟編譯器警告(如GCC的`-Wall`選項(xiàng),會(huì)提示“variable‘x’isuseduninitialized”);使用靜態(tài)代碼分析工具(如`cppcheck`);調(diào)試時(shí)觀察變量值(調(diào)試器中未初始化變量通常顯示為特殊值)。全局變量和靜態(tài)變量默認(rèn)初始化為0(或空指針),無需擔(dān)心未初始化。`charstr="hello";`和`charstr[]="hello";`的區(qū)別?前者`str`是指向字符串字面量的指針(存儲在只讀內(nèi)存區(qū),修改
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 消防安全知識培訓(xùn)考試卷及答案(供參考)
- 新入崗進(jìn)修生等醫(yī)院感染防控培訓(xùn)考核試題及答案
- 物業(yè)管理員高級模擬試題與答案
- 社區(qū)考試筆試題庫及答案
- 工程監(jiān)理自考試卷及答案
- 財(cái)會(huì)管理考試題及答案
- 人體生理學(xué)各章節(jié)復(fù)習(xí)題及答案(X頁)
- 檢驗(yàn)技師考試《臨床檢驗(yàn)基礎(chǔ)》試題及答案
- 昆明市祿勸彝族苗族自治縣輔警公共基礎(chǔ)知識題庫(附答案)
- 茶藝師茶史講解題庫及答案
- 云南省2026年普通高中學(xué)業(yè)水平選擇性考試調(diào)研測試歷史試題(含答案詳解)
- GB 4053.3-2025固定式金屬梯及平臺安全要求第3部分:工業(yè)防護(hù)欄桿及平臺
- 2026中央廣播電視總臺招聘124人參考筆試題庫及答案解析
- JG/T 3030-1995建筑裝飾用不銹鋼焊接管材
- GB/T 20322-2023石油及天然氣工業(yè)往復(fù)壓縮機(jī)
- 中國重汽車輛識別代號(VIN)編制規(guī)則
- 項(xiàng)目管理學(xué)課件戚安邦全
- 羽毛球二級裁判員試卷
- 通風(fēng)與空調(diào)監(jiān)理實(shí)施細(xì)則abc
- JJF 1614-2017抗生素效價(jià)測定儀校準(zhǔn)規(guī)范
- GB/T 5237.3-2017鋁合金建筑型材第3部分:電泳涂漆型材
評論
0/150
提交評論