版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
高頻c語(yǔ)言面試試題及答案Q:請(qǐng)說(shuō)明C語(yǔ)言中sizeof和strlen的區(qū)別。A:sizeof是運(yùn)算符,用于計(jì)算數(shù)據(jù)類(lèi)型或變量在內(nèi)存中占用的字節(jié)數(shù),編譯時(shí)確定結(jié)果,不關(guān)心內(nèi)存中實(shí)際存儲(chǔ)的內(nèi)容。strlen是庫(kù)函數(shù)(聲明在string.h中),用于計(jì)算以'\0'結(jié)尾的字符串的實(shí)際長(zhǎng)度(不包含'\0'),運(yùn)行時(shí)通過(guò)遍歷內(nèi)存直到遇到'\0'終止。例如,定義chararr[]="hello";則sizeof(arr)結(jié)果為6(包含'\0'),strlen(arr)結(jié)果為5。若定義charp="hello";則sizeof(p)是指針大?。?2位系統(tǒng)4字節(jié),64位8字節(jié)),strlen(p)仍為5。需注意,當(dāng)數(shù)組作為參數(shù)傳遞給函數(shù)時(shí),數(shù)組退化為指針,此時(shí)sizeof無(wú)法正確獲取數(shù)組大小。Q:const關(guān)鍵字有哪些常見(jiàn)用法?A:const用于修飾變量、指針或函數(shù)參數(shù),表明其值不可被顯式修改(編譯階段保護(hù))。常見(jiàn)場(chǎng)景包括:1.修飾變量:constinta=10;變量a初始化后值不可修改,存儲(chǔ)位置可能在只讀數(shù)據(jù)段(具體取決于編譯器)。2.修飾指針:constintp;(指針指向的內(nèi)容不可修改,即“常量指針”)intconstp;(指針本身不可修改,即“指針常量”)constintconstp;(指針本身和指向的內(nèi)容均不可修改)3.修飾函數(shù)參數(shù):voidfunc(constintarr);防止函數(shù)內(nèi)部修改傳入的數(shù)組內(nèi)容,提高代碼健壯性。4.修飾函數(shù)返回值:constchargetStr();避免返回的指針被錯(cuò)誤修改,常用于返回字符串字面量的場(chǎng)景。需注意,const修飾的變量并非絕對(duì)不可修改(如通過(guò)指針強(qiáng)制轉(zhuǎn)換可繞過(guò),但會(huì)導(dǎo)致未定義行為),其核心作用是約束程序員的操作,減少錯(cuò)誤。Q:解釋volatile關(guān)鍵字的作用及使用場(chǎng)景。A:volatile用于告訴編譯器變量的值可能被程序外部(如硬件寄存器、多線程、中斷服務(wù)程序)修改,禁止編譯器對(duì)該變量進(jìn)行優(yōu)化(如緩存到寄存器、刪除冗余讀?。5湫褪褂脠?chǎng)景包括:1.硬件寄存器操作:如讀取外設(shè)狀態(tài)寄存器,每次必須從內(nèi)存讀取最新值。2.多線程共享變量:防止編譯器因優(yōu)化而忽略其他線程對(duì)變量的修改(但volatile不保證原子性,多線程同步仍需依賴(lài)鎖或原子操作)。3.中斷服務(wù)程序(ISR)與主程序共享的變量:ISR可能在任意時(shí)刻修改變量,需確保主程序讀取的是最新值。例如,定義volatileintflag=0;在循環(huán)中檢測(cè)flag時(shí),編譯器不會(huì)將flag緩存到寄存器,而是每次從內(nèi)存讀取,避免因優(yōu)化導(dǎo)致的死循環(huán)。Q:static關(guān)鍵字在C語(yǔ)言中有哪些作用?A:static在不同上下文中有不同含義:1.修飾局部變量:延長(zhǎng)生命周期(存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū),程序運(yùn)行期間僅初始化一次),但作用域仍為所在函數(shù)。例如:voidfunc(){staticinta=0;a++;printf("%d",a);}多次調(diào)用func()會(huì)輸出123...(每次調(diào)用a保留上次的值)。2.修飾全局變量:限制作用域?yàn)楫?dāng)前文件(外部文件無(wú)法通過(guò)extern聲明訪問(wèn)),避免全局變量命名沖突。3.修飾函數(shù):限制函數(shù)作用域?yàn)楫?dāng)前文件(外部文件無(wú)法調(diào)用),實(shí)現(xiàn)模塊內(nèi)部函數(shù)的封裝,提高代碼安全性。需注意,static變量的初始化僅在編譯時(shí)執(zhí)行一次,若未顯式初始化則默認(rèn)初始化為0(局部變量默認(rèn)初始化為隨機(jī)值)。Q:指針和數(shù)組的區(qū)別與聯(lián)系是什么?A:聯(lián)系:數(shù)組名在多數(shù)情況下會(huì)退化為指向首元素的指針(如作為函數(shù)參數(shù)傳遞時(shí)),因此可以通過(guò)指針操作數(shù)組元素(如(arr+2)等價(jià)于arr[2])。區(qū)別:1.類(lèi)型不同:數(shù)組是連續(xù)內(nèi)存空間的集合(如intarr[5]類(lèi)型為int[5]),指針是存儲(chǔ)地址的變量(類(lèi)型為int)。2.sizeof結(jié)果不同:sizeof(arr)返回?cái)?shù)組總大?。ㄔ貍€(gè)數(shù)×元素大小),sizeof(p)返回指針大小(與系統(tǒng)位數(shù)相關(guān))。3.內(nèi)存分配方式不同:數(shù)組若為局部變量存儲(chǔ)在棧上,大小編譯時(shí)確定;指針可指向堆、棧或靜態(tài)存儲(chǔ)區(qū)的內(nèi)存,大小動(dòng)態(tài)分配。4.可修改性不同:數(shù)組名是常量指針(不可自增/自減),指針變量可修改指向的地址(如p++合法,arr++非法)。示例:chararr[]="test";charp=arr;則arr是數(shù)組名(地址固定),p是指針變量(可重新賦值為其他地址)。Q:什么是野指針?如何避免?A:野指針是指向無(wú)效內(nèi)存地址的指針,訪問(wèn)時(shí)會(huì)導(dǎo)致程序崩潰或未定義行為。產(chǎn)生原因及解決方法:1.指針未初始化:定義指針后未賦值(指向隨機(jī)內(nèi)存)。解決:聲明時(shí)初始化為NULL,或指向有效地址。2.指針指向的內(nèi)存被釋放后未置空:free或delete釋放內(nèi)存后,指針仍指向已釋放的地址(“懸空指針”)。解決:釋放后將指針置為NULL,并在使用前檢查是否為NULL。3.指針越界訪問(wèn):指向數(shù)組時(shí)超出數(shù)組范圍(如訪問(wèn)arr[10]當(dāng)數(shù)組大小為5時(shí))。解決:嚴(yán)格控制索引范圍,使用循環(huán)時(shí)檢查邊界。示例:intp=NULL;//正確初始化p=(int)malloc(sizeof(int));free(p);p=NULL;//釋放后置空,避免成為野指針Q:指針數(shù)組和數(shù)組指針的區(qū)別是什么?A:指針數(shù)組是“存儲(chǔ)指針的數(shù)組”,本質(zhì)是數(shù)組;數(shù)組指針是“指向數(shù)組的指針”,本質(zhì)是指針。定義方式:指針數(shù)組:類(lèi)型數(shù)組名[大小];如intarr[5];表示一個(gè)包含5個(gè)int指針的數(shù)組。數(shù)組指針:類(lèi)型(指針名)[大小];如int(p)[5];表示p是一個(gè)指向包含5個(gè)int元素的數(shù)組的指針。使用場(chǎng)景:指針數(shù)組常用于存儲(chǔ)多個(gè)字符串(如charstrs[]={"a","b","c"};);數(shù)組指針常用于二維數(shù)組的參數(shù)傳遞(如voidfunc(int(p)[5],introw);可接收intarr[3][5]類(lèi)型的參數(shù))。示例:intarr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};int(p)[4]=arr;//p指向arr的首行(類(lèi)型為int[4])p[1][2]等價(jià)于arr[1][2](值為7)。Q:函數(shù)指針的作用是什么?如何定義和使用?A:函數(shù)指針是指向函數(shù)的指針變量,存儲(chǔ)函數(shù)的入口地址,可用于實(shí)現(xiàn)回調(diào)函數(shù)、函數(shù)表等動(dòng)態(tài)調(diào)用機(jī)制。定義方式:返回值類(lèi)型(指針名)(參數(shù)類(lèi)型列表);例如,定義指向“int類(lèi)型返回值,兩個(gè)int參數(shù)”的函數(shù)指針:int(func_ptr)(int,int);使用步驟:1.定義函數(shù):intadd(inta,intb){returna+b;}2.初始化指針:func_ptr=add;或func_ptr=&add;(函數(shù)名本身即地址)3.調(diào)用函數(shù):intres=func_ptr(3,5);或intres=(func_ptr)(3,5);(兩種方式等價(jià))應(yīng)用場(chǎng)景:回調(diào)函數(shù):如qsort庫(kù)函數(shù)的第三個(gè)參數(shù)是比較函數(shù)指針,用戶(hù)自定義比較邏輯。狀態(tài)機(jī):通過(guò)函數(shù)指針數(shù)組根據(jù)當(dāng)前狀態(tài)調(diào)用對(duì)應(yīng)的處理函數(shù),提高代碼可維護(hù)性。Q:malloc、calloc、realloc的區(qū)別是什么?A:三者均用于動(dòng)態(tài)內(nèi)存分配(堆內(nèi)存),聲明在stdlib.h中:malloc:分配指定字節(jié)數(shù)的內(nèi)存,不初始化。原型:voidmalloc(size_tsize);若分配失敗返回NULL。calloc:分配“元素個(gè)數(shù)×元素大小”的內(nèi)存,并初始化為0。原型:voidcalloc(size_tnum,size_tsize);等價(jià)于malloc(numsize)后memset清零,但更高效(由內(nèi)存分配器直接清零)。realloc:調(diào)整已分配內(nèi)存的大?。〝U(kuò)大或縮?。T停簐oidrealloc(voidptr,size_tnew_size);若ptr為NULL,等價(jià)于malloc(new_size);若new_size為0,等價(jià)于free(ptr)。調(diào)整時(shí)可能移動(dòng)內(nèi)存塊(原內(nèi)存內(nèi)容復(fù)制到新地址,原地址失效),需用返回值更新指針。示例:intp1=(int)malloc(5sizeof(int));//分配5個(gè)int的空間(未初始化)intp2=(int)calloc(5,sizeof(int));//分配5個(gè)int的空間,初始化為0p1=(int)realloc(p1,10sizeof(int));//擴(kuò)大p1的空間到10個(gè)int(可能移動(dòng))Q:如何檢測(cè)內(nèi)存泄漏?A:內(nèi)存泄漏指動(dòng)態(tài)分配的內(nèi)存未釋放,導(dǎo)致堆內(nèi)存逐漸耗盡。檢測(cè)方法包括:1.手動(dòng)檢查:在關(guān)鍵代碼段添加日志,記錄malloc/free的調(diào)用次數(shù)和大小,對(duì)比是否匹配。2.工具檢測(cè):Valgrind(Linux):通過(guò)memcheck工具跟蹤內(nèi)存分配和釋放,輸出泄漏報(bào)告(如“definitelylost”表示明確未釋放)。Dr.Memory(跨平臺(tái)):針對(duì)C/C++的內(nèi)存錯(cuò)誤檢測(cè)工具,可檢測(cè)泄漏、越界訪問(wèn)等。編譯器擴(kuò)展:如MSVC的_CrtDumpMemoryLeaks()函數(shù)(需在調(diào)試模式下啟用,通過(guò)define_CRTDBG_MAP_ALLOC跟蹤分配點(diǎn))。3.封裝內(nèi)存函數(shù):自定義malloc和free的包裝函數(shù),記錄分配信息(地址、大小、調(diào)用位置),程序結(jié)束時(shí)檢查未釋放的內(nèi)存。例如:definemalloc(size)my_malloc(size,__FILE__,__LINE__)voidmy_malloc(size_tsize,constcharfile,intline){voidptr=malloc(size);record_allocation(ptr,size,file,line);//記錄到日志或哈希表returnptr;}voidmy_free(voidptr){free(ptr);remove_allocation(ptr);//從記錄中刪除}Q:結(jié)構(gòu)體和聯(lián)合體(共用體)的區(qū)別是什么?A:結(jié)構(gòu)體(struct)中各成員擁有獨(dú)立的內(nèi)存空間,總大小是各成員大小之和(考慮內(nèi)存對(duì)齊);聯(lián)合體(union)中所有成員共享同一塊內(nèi)存空間,總大小是最大成員的大?。ㄐ铦M(mǎn)足所有成員的對(duì)齊要求)。示例:structS{charc;//1字節(jié)inti;//4字節(jié)(對(duì)齊后結(jié)構(gòu)體總大小8字節(jié),c后填充3字節(jié))};unionU{charc;//1字節(jié)inti;//4字節(jié)(聯(lián)合體總大小4字節(jié),c和i共享前4字節(jié))};關(guān)鍵區(qū)別:結(jié)構(gòu)體用于存儲(chǔ)多個(gè)相關(guān)但獨(dú)立的數(shù)據(jù)(如學(xué)生信息:姓名、年齡、成績(jī));聯(lián)合體用于同一數(shù)據(jù)的不同表示形式(如IP地址的點(diǎn)分十進(jìn)制和32位整數(shù))。聯(lián)合體修改一個(gè)成員會(huì)影響其他成員的值(因共享內(nèi)存),結(jié)構(gòu)體各成員修改互不影響。Q:位域的作用是什么?如何定義?A:位域用于在結(jié)構(gòu)體中以位為單位分配內(nèi)存,節(jié)省空間(尤其在嵌入式系統(tǒng)中處理硬件寄存器位操作)。定義方式為:結(jié)構(gòu)體成員后加冒號(hào)和位數(shù)(如inta:3;表示a占3位)。注意事項(xiàng):位域類(lèi)型只能是int、unsignedint、signedint(部分編譯器支持char)。位域?qū)挾炔荒艹^(guò)類(lèi)型的最大位數(shù)(如unsignedint的位域最多32位)。無(wú)名位域(如int:4;)用于填充,不可訪問(wèn)。位域跨類(lèi)型時(shí)(如struct{chara:5;intb:3;})可能因編譯器對(duì)齊規(guī)則導(dǎo)致額外填充。示例(表示TCP標(biāo)志位):structTcpFlags{unsignedinturg:1;//緊急指針有效unsignedintack:1;//確認(rèn)號(hào)有效unsignedintpsh:1;//推送數(shù)據(jù)unsignedintrst:1;//重置連接unsignedintsyn:1;//同步序號(hào)unsignedintfin:1;//終止連接};//總大小通常為1字節(jié)(6位+2位填充)Q:預(yù)處理指令include、define、ifdef的作用是什么?A:include:將指定頭文件內(nèi)容插入到當(dāng)前位置(分<>和"",前者搜索系統(tǒng)頭文件路徑,后者搜索當(dāng)前目錄)。define:定義宏(對(duì)象宏或函數(shù)宏),編譯前進(jìn)行文本替換。例如:defineMAX(a,b)((a)>(b)?(a):(b))//函數(shù)宏,需用括號(hào)避免優(yōu)先級(jí)問(wèn)題ifdef:條件編譯,根據(jù)宏是否定義決定是否編譯某段代碼。常見(jiàn)組合:ifdefDEBUGprintf("Debuginfo:%d\n",value);endif其他條件編譯指令包括ifndef(未定義時(shí)編譯)、if(表達(dá)式為真時(shí)編譯)、elif、else、endif。Q:宏和函數(shù)的優(yōu)缺點(diǎn)對(duì)比。A:優(yōu)點(diǎn):宏:編譯前替換,無(wú)函數(shù)調(diào)用開(kāi)銷(xiāo)(壓棧、跳轉(zhuǎn)、返回),適合輕量操作(如簡(jiǎn)單計(jì)算)。函數(shù):參數(shù)有類(lèi)型檢查,避免錯(cuò)誤;可調(diào)試(宏替換后難以跟蹤);代碼復(fù)用性更好(宏可能因多次替換導(dǎo)致代碼膨脹)。缺點(diǎn):宏:無(wú)類(lèi)型檢查,可能因參數(shù)副作用導(dǎo)致錯(cuò)誤(如MAX(i++,j++)會(huì)導(dǎo)致i被遞增兩次);宏定義過(guò)長(zhǎng)時(shí)可讀性差;無(wú)法調(diào)試(替換后的代碼可能與預(yù)期不同)。函數(shù):存在調(diào)用開(kāi)銷(xiāo)(尤其對(duì)極小函數(shù));無(wú)法在編譯時(shí)展開(kāi)(宏可用于提供代碼,如模板元編程思想)。Q:數(shù)組作為函數(shù)參數(shù)時(shí)為何會(huì)退化為指針?A:C語(yǔ)言中,數(shù)組作為函數(shù)參數(shù)傳遞時(shí),編譯器會(huì)將其轉(zhuǎn)換為指向數(shù)組首元素的指針(“數(shù)組到指針的退化”),目的是避免數(shù)組的整體復(fù)制(若數(shù)組很大,傳值會(huì)導(dǎo)致性能問(wèn)題)。因此,函數(shù)參數(shù)中聲明的數(shù)組實(shí)際是指針類(lèi)型。例如:voidfunc(intarr[5]){...}//等價(jià)于voidfunc(intarr){...}此時(shí),在函數(shù)內(nèi)部使用sizeof(arr)得到的是指針大小(而非數(shù)組大?。?,無(wú)法直接獲取數(shù)組元素個(gè)數(shù)。解決方法是額外傳遞數(shù)組長(zhǎng)度作為參數(shù)(如voidfunc(intarr,intlen))。Q:字符串和字符數(shù)組的區(qū)別是什么?A:字符串是字符數(shù)組的特殊形式,以'\0'結(jié)尾(C語(yǔ)言無(wú)獨(dú)立字符串類(lèi)型)。字符數(shù)組不一定是字符串(若未以'\0'結(jié)尾,使用strlen等函數(shù)會(huì)越界)。示例:chararr1[]="hello";//隱式添加'\0',長(zhǎng)度6('h','e','l','l','o','\0')chararr2[]={'h','e','l','l','o'};//無(wú)'\0',不是合法字符串,strlen(arr2)會(huì)繼續(xù)讀取后續(xù)內(nèi)存直到遇到'\0'charstr="world";//字符串字面量存儲(chǔ)在只讀數(shù)據(jù)段,str是指向該地址的指針(不可修改內(nèi)容)Q:如何實(shí)現(xiàn)strcpy函數(shù)?需考慮哪些邊界情況?A:strcpy將源字符串復(fù)制到目標(biāo)空間,需確保目標(biāo)空間足夠大(否則緩沖區(qū)溢出)。實(shí)現(xiàn)示例:charmy_strcpy(chardest,constcharsrc){if(dest==NULL||src==NULL)returnNULL;//檢查空指針charret=dest;//保存目標(biāo)起始地址while((dest++=src++)!='\0');//復(fù)制字符直到'\0'returnret;}需考慮的邊界情況:源或目標(biāo)指針為NULL(需添加判空處理)。目標(biāo)空間不足(調(diào)用者需保證dest的容量≥strlen(src)+1,函數(shù)本身無(wú)法檢測(cè))。內(nèi)存重疊(如dest在src之后且有重疊,使用strcpy會(huì)導(dǎo)致數(shù)據(jù)覆蓋,此時(shí)應(yīng)使用memmove)。Q:位運(yùn)算有哪些常見(jiàn)應(yīng)用?A:位運(yùn)算用于高效處理二進(jìn)制位,常見(jiàn)場(chǎng)景包括:1.判斷奇偶:x&1(結(jié)果為1則奇數(shù),0則偶數(shù))。2.交換兩數(shù)(無(wú)需臨時(shí)變量):a^=b;b^=a;a^=b;(利用異或的自反性:a^b^b=a)。3.清零特定位:x&~mask(mask對(duì)應(yīng)位為1,其余為0)。4.設(shè)置特定位:x|mask。5.檢測(cè)特定位是否為1:x&mask(結(jié)果非0則該位為1)。6.計(jì)算2的冪次:1<<n(等價(jià)于2^n)。7.位計(jì)數(shù)(統(tǒng)計(jì)二進(jìn)制中1的個(gè)數(shù)):循環(huán)右移并累加每一位,或使用快速算法(如x&=x-1消除最低位的1)。Q:C語(yǔ)言中輸入輸出的緩沖機(jī)制是怎樣的?A:C標(biāo)準(zhǔn)I/O函數(shù)(如printf、scanf)使用緩沖提高效率,緩沖類(lèi)型分為:全緩沖:當(dāng)緩沖區(qū)填滿(mǎn)或調(diào)用fflush、程序結(jié)束時(shí)才實(shí)際讀寫(xiě)(如對(duì)磁盤(pán)文件的操作)。行緩沖:當(dāng)遇到換行符'\n'或緩沖區(qū)填滿(mǎn)時(shí)刷新(如標(biāo)準(zhǔn)輸入stdout,默認(rèn)行緩沖)。無(wú)緩沖:數(shù)據(jù)立即讀寫(xiě)(如stderr,需實(shí)時(shí)輸出錯(cuò)誤信息)??赏ㄟ^(guò)setvbuf函數(shù)自定義緩沖類(lèi)型和大?。ㄐ柙谖募蜷_(kāi)后、I/O操作前調(diào)用)。示例:setvbuf(stdout,NULL,_IOLBF,0);//設(shè)置stdout為行緩沖(默認(rèn)行為)setvbuf(fp,buf,_IOFBF,BUFSIZ);//設(shè)置文件fp為全緩沖,使用自定義緩沖區(qū)bufQ:編譯過(guò)程分為哪幾個(gè)階段?各階段的作用是什么?A:C程序編譯過(guò)程分為預(yù)處理、編譯、匯編、鏈接四個(gè)階段:1.預(yù)處理(預(yù)處理器):處理include、define、ifdef等指令,提供擴(kuò)展后的源文件(如將頭文件內(nèi)容插入,宏替換,刪除注釋?zhuān)?.編譯(編譯器):將預(yù)處理后的代碼轉(zhuǎn)換為匯編語(yǔ)言(檢查語(yǔ)法、語(yǔ)義錯(cuò)誤,提供中間代碼)。3.匯編(匯編器):將匯編語(yǔ)言轉(zhuǎn)換為機(jī)器可執(zhí)行的目標(biāo)文件(.o或.obj,包含二進(jìn)制指令和符號(hào)表)。4.鏈接(鏈接器):將多個(gè)目標(biāo)文件及庫(kù)文件(靜態(tài)庫(kù)或動(dòng)態(tài)庫(kù))鏈接成可執(zhí)行文件,解決符號(hào)引用(如函數(shù)調(diào)用的地址綁定)。關(guān)鍵概念:靜態(tài)鏈接:將庫(kù)函數(shù)代碼直接復(fù)制到可執(zhí)行文件(體積大,運(yùn)行時(shí)無(wú)需依賴(lài)庫(kù))。動(dòng)態(tài)鏈接:可執(zhí)行文件僅記錄庫(kù)函數(shù)的位置,運(yùn)行時(shí)加載共享庫(kù)(節(jié)省磁盤(pán)空間,支持庫(kù)的版本升級(jí))。Q:靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別是什么?A:靜態(tài)庫(kù)(.a/.lib):鏈接時(shí)將庫(kù)代碼復(fù)制到目標(biāo)文件,提供的可執(zhí)行文件獨(dú)立(無(wú)需依賴(lài)庫(kù)文件),但多個(gè)程序使用同一庫(kù)會(huì)重復(fù)占用內(nèi)存,庫(kù)更新需重新編譯程序。動(dòng)態(tài)庫(kù)(.so/.dll):鏈接時(shí)僅記錄庫(kù)的位置,運(yùn)行時(shí)加載到內(nèi)存供多個(gè)程序共享(節(jié)省內(nèi)存),庫(kù)更新只需替換庫(kù)文件(無(wú)需重新編譯程序),但運(yùn)行時(shí)依賴(lài)庫(kù)存在(否則無(wú)法執(zhí)行)。提供方式:靜態(tài)庫(kù):arrcslibtest.atest.o(將目標(biāo)文件打包)動(dòng)態(tài)庫(kù):gcc-shared-fPIC-olibtest.sotest.o(-fPIC提供位置無(wú)關(guān)代碼)Q:如何理解“內(nèi)存對(duì)齊”?對(duì)齊規(guī)則是什么?A:內(nèi)存對(duì)齊是編譯器為優(yōu)化訪問(wèn)效率,將變量存儲(chǔ)在其類(lèi)型大小的整數(shù)倍地址處的策略(CPU訪問(wèn)對(duì)齊內(nèi)存的速度更快,部分架構(gòu)禁止訪問(wèn)未對(duì)齊內(nèi)存)。對(duì)齊規(guī)則:1.基本類(lèi)型的對(duì)齊數(shù)為其大?。ㄈ鏲har1字節(jié),int4字節(jié),double8字節(jié))。2.結(jié)構(gòu)體的對(duì)齊數(shù)為其成員中最大對(duì)齊數(shù)。3.結(jié)構(gòu)體成員的起始地址需是其對(duì)齊數(shù)的整數(shù)倍(成員間可能填充字節(jié))。4.結(jié)構(gòu)體總大小需是其對(duì)齊數(shù)的整數(shù)倍(末尾可能填充字節(jié))。示例:structA{charc;//1字節(jié),對(duì)齊數(shù)1,起始地址0inti;//4字節(jié),對(duì)齊數(shù)4,需從地址4開(kāi)始(填充3字節(jié))shorts;//2字節(jié),對(duì)齊數(shù)2,起始地址8};//總對(duì)齊數(shù)4,總大小需為4的倍數(shù)(8+2=10,填充2字節(jié),總大小12)Q:如何判斷一段程序是大端模式還是小端模式?A:大端模式(網(wǎng)絡(luò)字節(jié)序):高位字節(jié)存儲(chǔ)在低地址,低位字節(jié)存儲(chǔ)在高地址;小端模式(主機(jī)字節(jié)序):低位字節(jié)存儲(chǔ)在低地址,高位字節(jié)存儲(chǔ)在高地址。檢測(cè)方法(利用聯(lián)合體共享內(nèi)存的特性):intcheck_endian(){union{inti;charc;}u;u.i=1
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 錦州市太和區(qū)社區(qū)《網(wǎng)格員》真題匯編(含答案)
- PICC測(cè)試題附答案
- 三基護(hù)理管理試題及答案
- 嵐皋縣輔警招聘考試試題庫(kù)帶答案
- 本科護(hù)理操作題庫(kù)及答案
- 永德縣輔警招聘公安基礎(chǔ)知識(shí)考試題庫(kù)及答案
- 心理精神科護(hù)理試題及參考答案
- 2025年質(zhì)量工程師職業(yè)能力評(píng)估試題集(附答案)
- 特殊兒童早期干預(yù)自考試卷四真題及答案
- 2025年食品安全管理員模擬考試題庫(kù)(含參考答案)
- 消化內(nèi)鏡ERCP技術(shù)改良
- DB37-T6005-2026人為水土流失風(fēng)險(xiǎn)分級(jí)評(píng)價(jià)技術(shù)規(guī)范
- 云南師大附中2026屆高三1月高考適應(yīng)性月考卷英語(yǔ)(六)含答案
- 2026湖北隨州農(nóng)商銀行科技研發(fā)中心第二批人員招聘9人筆試備考試題及答案解析
- 紀(jì)念館新館項(xiàng)目可行性研究報(bào)告
- 仁愛(ài)科普版(2024)八年級(jí)上冊(cè)英語(yǔ)Unit1~Unit6補(bǔ)全對(duì)話(huà)練習(xí)題(含答案)
- 騎行美食活動(dòng)方案策劃(3篇)
- 石化企業(yè)環(huán)保培訓(xùn)課件
- 2026年呂梁職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試備考試題帶答案解析
- 2025年新疆師范大學(xué)輔導(dǎo)員招聘考試真題及答案
- 電梯更新改造方案
評(píng)論
0/150
提交評(píng)論