版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
高頻c語言面試題及答案C語言中sizeof和strlen的區(qū)別是什么?sizeof是編譯時(shí)運(yùn)算符,用于計(jì)算數(shù)據(jù)類型或變量在內(nèi)存中占用的字節(jié)數(shù)。對于數(shù)組,sizeof返回整個(gè)數(shù)組的字節(jié)大小;對于指針,返回指針本身的字節(jié)大小(與平臺(tái)相關(guān),32位4字節(jié),64位8字節(jié))。strlen是標(biāo)準(zhǔn)庫函數(shù)(<string.h>),用于計(jì)算C字符串的實(shí)際長度(不包含結(jié)束符'\0')。其本質(zhì)是遍歷字符直到遇到'\0',因此要求參數(shù)必須是合法的以'\0'結(jié)尾的字符串,否則會(huì)導(dǎo)致越界訪問。例如:chararr[]="test";sizeof(arr)結(jié)果為5(包含'\0'),strlen(arr)結(jié)果為4;若定義charptr=arr;sizeof(ptr)在64位系統(tǒng)為8,strlen(ptr)仍為4。常量指針和指針常量有何區(qū)別?常量指針的定義形式為constcharptr(或charconstptr),表示指針指向的內(nèi)容不可修改,但指針本身可以重新指向其他地址。例如:constcharp="hello";p='H'(錯(cuò)誤,內(nèi)容不可改),p="world"(正確,指針可改)。指針常量的定義形式為charconstptr,表示指針本身的地址不可修改,但指向的內(nèi)容可以修改。例如:charstr[]="test";charconstp=str;p=&str[1](錯(cuò)誤,指針不可改),p='T'(正確,內(nèi)容可改)。若兩者結(jié)合(constcharconstptr),則指針地址和指向內(nèi)容均不可修改。結(jié)構(gòu)體成員對齊的規(guī)則是什么?結(jié)構(gòu)體對齊遵循編譯器默認(rèn)的對齊系數(shù)(可通過pragmapack(n)修改)和成員自身大小的最小值作為對齊單位。具體規(guī)則:第一個(gè)成員偏移量為0;后續(xù)成員的偏移量必須是其自身大小與對齊系數(shù)中較小值的整數(shù)倍;結(jié)構(gòu)體總大小需是所有成員對齊單位最大值的整數(shù)倍。例如:structA{chara;//1字節(jié),偏移0intb;//4字節(jié),需對齊到4的倍數(shù),偏移4(填充3字節(jié))shortc;//2字節(jié),對齊到2,偏移8(4+4=8)};//總大小需是最大對齊單位(4)的倍數(shù),8+2=10,填充到12字節(jié)若使用pragmapack(2),則對齊系數(shù)為2。此時(shí)int的對齊單位為min(4,2)=2,char偏移0,int偏移2(填充1字節(jié)),short偏移6(2+4=6),總大小8(6+2=8,是2的倍數(shù))。對齊的目的是提高CPU訪問效率,減少跨內(nèi)存塊讀取的情況。static關(guān)鍵字在C語言中的作用有哪些?在函數(shù)內(nèi)部,static修飾的局部變量會(huì)存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū),僅初始化一次,生命周期持續(xù)到程序結(jié)束,下次調(diào)用函數(shù)時(shí)保留上次的值。例如:voidfunc(){staticintcount=0;count++;printf("%d",count);}//多次調(diào)用會(huì)輸出123...在函數(shù)外部(全局作用域),static修飾的全局變量或函數(shù)僅在當(dāng)前源文件可見,其他文件無法通過extern聲明訪問。這用于限制變量/函數(shù)的作用域,避免不同文件間的命名沖突。例如:staticintglobal=10;僅當(dāng)前文件可訪問。內(nèi)存泄漏的常見場景及檢測方法?內(nèi)存泄漏指動(dòng)態(tài)分配的內(nèi)存未釋放且無法再訪問(指針丟失)。常見場景:malloc/calloc后未調(diào)用free釋放;函數(shù)返回堆內(nèi)存指針但未被正確釋放;重復(fù)調(diào)用realloc時(shí)未保存舊指針導(dǎo)致丟失;異常分支(如提前return)未釋放已分配內(nèi)存。檢測方法:1.工具檢測:如Valgrind(Linux)的memcheck工具,可跟蹤內(nèi)存分配和釋放,報(bào)告泄漏位置;2.手動(dòng)排查:在關(guān)鍵位置打印內(nèi)存分配/釋放日志,統(tǒng)計(jì)分配次數(shù)與釋放次數(shù)是否匹配;3.封裝內(nèi)存函數(shù):自定義malloc和free,記錄分配信息(文件名、行號),程序結(jié)束時(shí)檢查未釋放的內(nèi)存。指針運(yùn)算的規(guī)則有哪些?指針運(yùn)算基于所指向的數(shù)據(jù)類型的大小。例如,intp指向地址0x1000,p+1的結(jié)果是0x1004(int占4字節(jié));charq指向0x1000,q+1是0x1001(char占1字節(jié))。指針相減僅當(dāng)指向同一數(shù)組元素時(shí)才有意義,結(jié)果為元素個(gè)數(shù)差(如p2-p1得到兩指針間的元素?cái)?shù)量)。指針與整數(shù)相加/減時(shí),結(jié)果需仍指向同一數(shù)組或數(shù)組尾后一個(gè)位置,否則為未定義行為。函數(shù)指針的作用及使用場景?函數(shù)指針是指向函數(shù)的指針變量,定義形式為:返回值類型(指針名)(參數(shù)類型列表)。例如:int(func_ptr)(int,int);可指向如intadd(inta,intb){returna+b;}的函數(shù)。使用場景包括:1.回調(diào)函數(shù):將函數(shù)指針作為參數(shù)傳遞,由外部函數(shù)調(diào)用(如qsort的比較函數(shù)參數(shù));2.函數(shù)跳轉(zhuǎn)表:根據(jù)條件動(dòng)態(tài)選擇調(diào)用的函數(shù)(如狀態(tài)機(jī)處理不同事件);3.實(shí)現(xiàn)多態(tài):在不修改接口的情況下替換具體實(shí)現(xiàn)(類似面向?qū)ο蟮奶摵瘮?shù))。宏定義的常見陷阱及注意事項(xiàng)?宏定義在預(yù)處理階段展開,需注意括號和副作用問題。陷阱1:未加括號導(dǎo)致運(yùn)算優(yōu)先級錯(cuò)誤。例如:defineSQUARE(x)xx,當(dāng)調(diào)用SQUARE(2+3)時(shí)展開為2+32+3=11,正確寫法應(yīng)為defineSQUARE(x)((x)(x))。陷阱2:參數(shù)包含自增/自減操作產(chǎn)生副作用。例如:defineMAX(a,b)((a)>(b)?(a):(b)),若調(diào)用MAX(i++,j++),會(huì)導(dǎo)致i和j被遞增兩次(條件判斷和返回值各一次)。陷阱3:宏定義結(jié)尾加分號可能導(dǎo)致語句錯(cuò)誤。例如:defineDEBUGprintf("debug\n");若在if語句中使用if(cond)DEBUGelse...,會(huì)展開為if(cond)printf("debug\n");;else...,導(dǎo)致語法錯(cuò)誤。注意事項(xiàng):盡量為參數(shù)和整體表達(dá)式加括號;避免使用包含副作用的參數(shù);復(fù)雜邏輯優(yōu)先使用內(nèi)聯(lián)函數(shù)而非宏。C程序的內(nèi)存分區(qū)有哪些?各存儲(chǔ)什么內(nèi)容?C程序內(nèi)存通常分為:1.代碼區(qū)(TextSegment):存儲(chǔ)編譯后的機(jī)器指令,只讀,多進(jìn)程共享;2.數(shù)據(jù)區(qū)(DataSegment):已初始化全局變量和靜態(tài)變量(.data);未初始化全局變量和靜態(tài)變量(.bss),程序啟動(dòng)時(shí)自動(dòng)初始化為0;3.堆(Heap):動(dòng)態(tài)分配的內(nèi)存(malloc/calloc/realloc),需手動(dòng)管理,由低地址向高地址增長;4.棧(Stack):存儲(chǔ)局部變量、函數(shù)參數(shù)、返回地址等,由編譯器自動(dòng)管理,由高地址向低地址增長。例如:全局變量intg1=10(.data);staticints1;(.bss);main函數(shù)中的inta=20(棧);charp=malloc(10)(堆,p本身在棧)。如何判斷一個(gè)整數(shù)是大端序還是小端序?大端序(Big-Endian)指高位字節(jié)存儲(chǔ)在低地址,低位字節(jié)在高地址;小端序(Little-Endian)相反。檢測方法:1.利用聯(lián)合體(Union)的特性(所有成員共享同一塊內(nèi)存):unionCheck{inti;charc;};unionChecku;u.i=1;if(u.c==1)//低地址存低位字節(jié)printf("Little-Endian");elseprintf("Big-Endian");2.指針強(qiáng)制轉(zhuǎn)換:將int的地址轉(zhuǎn)換為char,取第一個(gè)字節(jié)判斷。例如:intnum=1;charptr=(char)#if(ptr==1)小端序,否則大端序。野指針的產(chǎn)生原因及避免方法?野指針指指向無效內(nèi)存地址的指針,產(chǎn)生原因:1.指針未初始化:定義指針后未賦值(指向隨機(jī)地址);2.指針指向的內(nèi)存已釋放:free后未將指針置NULL,成為“懸空指針”;3.指針越界訪問:指向數(shù)組外的內(nèi)存(如數(shù)組大小為5,訪問索引5的元素)。避免方法:指針聲明時(shí)初始化為NULL(charp=NULL;);free后立即將指針置NULL(free(p);p=NULL;);避免返回局部變量的指針(局部變量存儲(chǔ)在棧中,函數(shù)返回后內(nèi)存被回收);訪問指針前檢查是否為NULL(if(p!=NULL)p=10;)。static和const的區(qū)別是什么?static用于控制存儲(chǔ)周期和作用域:局部變量變?yōu)殪o態(tài)存儲(chǔ)(生命周期延長),全局變量/函數(shù)限制為文件內(nèi)可見。const用于修飾變量,表示其值不可被直接修改(編譯器層面的限制),但無法保證絕對不變(可通過指針強(qiáng)制轉(zhuǎn)換修改)。例如:constinta=10;a=20(錯(cuò)誤),但intp=(int)&a;p=20(可能成功,取決于編譯器優(yōu)化)。static變量存儲(chǔ)在數(shù)據(jù)區(qū),const變量若為全局/靜態(tài)則存儲(chǔ)在數(shù)據(jù)區(qū)(只讀段),局部const變量存儲(chǔ)在棧中。如何實(shí)現(xiàn)字符串的反轉(zhuǎn)?要求原地反轉(zhuǎn),不使用額外空間。例如將"hello"變?yōu)?olleh"。實(shí)現(xiàn)思路:雙指針法,用兩個(gè)指針分別指向字符串首尾,交換字符后向中間移動(dòng),直到相遇。代碼示例:voidreverse_string(charstr){if(str==NULL)return;charleft=str;charright=str+strlen(str)1;while(left<right){chartemp=left;left=right;right=temp;left++;right--;}}注意處理空指針和空字符串(strlen為0)的情況,避免越界訪問。動(dòng)態(tài)內(nèi)存分配函數(shù)malloc、calloc、realloc的區(qū)別?malloc分配指定大小的內(nèi)存塊,不初始化內(nèi)容(值為隨機(jī)),原型:voidmalloc(size_tsize)。calloc分配n個(gè)元素、每個(gè)大小為size的內(nèi)存塊,并初始化為0,原型:voidcalloc(size_tn,size_tsize),相當(dāng)于malloc(nsize)后memset為0。realloc調(diào)整已分配內(nèi)存的大小,原型:voidrealloc(voidptr,size_tnew_size)。若當(dāng)前內(nèi)存塊足夠擴(kuò)展,直接調(diào)整大小并返回原指針;若不足,重新分配新內(nèi)存塊,復(fù)制原內(nèi)容,釋放舊塊,返回新指針(原指針失效)。若ptr為NULL,realloc等同于malloc;若new_size為0,等同于free(ptr)。預(yù)處理、編譯、匯編、鏈接的作用分別是什么?1.預(yù)處理(Preprocessing):處理include、define、if等預(yù)處理指令,展開頭文件、替換宏、刪除注釋,提供.i文件;2.編譯(Compilation):將預(yù)處理后的代碼轉(zhuǎn)換為匯編語言,進(jìn)行詞法分析、語法分析、語義檢查,提供.s文件;3.匯編(Assembly):將匯編語言轉(zhuǎn)換為機(jī)器指令(二進(jìn)制目標(biāo)代碼),提供.o(或.obj)文件;4.鏈接(Linking):將多個(gè)目標(biāo)文件和庫文件(靜態(tài)/動(dòng)態(tài))鏈接成可執(zhí)行文件,解決符號引用(如函數(shù)調(diào)用、全局變量),提供.exe(Windows)或ELF(Linux)文件。如何判斷單鏈表是否有環(huán)?使用快慢指針法(Floyd判圈算法)。定義兩個(gè)指針,slow每次移動(dòng)1步,fast每次移動(dòng)2步。若鏈表有環(huán),fast最終會(huì)追上slow(相遇);若fast到達(dá)NULL(鏈表尾),則無環(huán)。代碼示例:structListNode{intval;structListNodenext;};boolhas_cycle(structListNodehead){if(head==NULL||head->next==NULL)returnfalse;structListNodeslow=head;structListNodefast=head->next;while(slow!=fast){if(fast==NULL||fast->next==NULL)returnfalse;slow=slow->next;fast=fast->next->next;}returntrue;}若需要找到環(huán)的入口點(diǎn),相遇后將slow重新指向頭節(jié)點(diǎn),slow和fast均每次移動(dòng)1步,再次相遇的節(jié)點(diǎn)即為入口點(diǎn)。數(shù)組和指針的區(qū)別是什么?數(shù)組是連續(xù)存儲(chǔ)相同類型元素的集合,數(shù)組名是常量指針(指向首元素地址,不可修改);指針是變量,存儲(chǔ)內(nèi)存地址。sizeof數(shù)組名返回整個(gè)數(shù)組的字節(jié)大小,sizeof指針返回指針本身的大小。數(shù)組作為函數(shù)參數(shù)傳遞時(shí)會(huì)退化為指針(丟失數(shù)組大小信息),因此無法在函數(shù)內(nèi)部用sizeof計(jì)算數(shù)組長度。例如:voidfunc(intarr[]){printf("%d",sizeof(arr));//輸出4或8(指針大?。﹠intmain(){intarr[5]={1,2,3,4,5};printf("%d",sizeof(arr));//輸出20(54)func(arr);return0;}如何實(shí)現(xiàn)一個(gè)高效的冒泡排序?傳統(tǒng)冒泡排序時(shí)間復(fù)雜度為O(n2),可通過以下優(yōu)化:1.記錄每輪是否發(fā)生交換,若未交換說明已有序,提前終止;2.記錄最后一次交換的位置,作為下一輪的邊界(后續(xù)元素已有序)。優(yōu)化后代碼:voidbubble_sort(intarr[],intn){if(n<=1)return;intlast_swap=n1;//初始邊界為最后一個(gè)元素for(inti=0;i<n1;i++){intswapped=0;intcurrent_swap=0;for(intj=0;j<last_swap;j++){if(arr[j]>arr[j+1]){inttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;swapped=1;current_swap=j;//記錄最后一次交換的位置}}if(!swapped)break;//無交換,提前結(jié)束last_swap=current_swap;//更新下一輪邊界}}const修飾函數(shù)參數(shù)和返回值的意義?修飾參數(shù):防止函數(shù)內(nèi)部修改輸入?yún)?shù)的值(如constcharstr防止修改字符串內(nèi)容)。修飾返回值:若返回指針或引用,防止調(diào)用者修改指向的內(nèi)容(如constcharget_str(),避免get_str()='a'這樣的操作)。例如:constcharget_message(){return"hello";}//調(diào)用者不能通過返回的指針修改字符串常量(可能導(dǎo)致崩潰)。如何計(jì)算二進(jìn)制中1的個(gè)數(shù)?方法1:位運(yùn)算,每次判斷最低位是否為1,然后右移。intcount_ones(intn){intcount=0;while(n){count+=n&1;n>>=1;}returncount;}方法2:利用n&(n-1)消除最低位的1。例如n=5(101),n-1=4(100),n&(n-1)=4(100);再次操作n=4&3=0,共2次循環(huán)。intcount_ones(intn){intcount=0;while(n){n&=n1;count++;}returncount;}后者時(shí)間復(fù)雜度為O(k),k為1的個(gè)數(shù),更高效。結(jié)構(gòu)體和聯(lián)合體的區(qū)別是什么?結(jié)構(gòu)體(struct)的每個(gè)成員占用獨(dú)立內(nèi)存空間,總大小是各成員大小之和(考慮對齊);聯(lián)合體(union)的所有成員共享同一塊內(nèi)存空間,總大小是最大成員的大?。紤]對齊)。例如:structS{chara;//1字節(jié)intb;//4字節(jié)(偏移4,總大小8)};unionU{chara;//1字節(jié)intb;//4字節(jié)(共享前4字節(jié))};//總大小4字節(jié)(最大成員大?。?。聯(lián)合體用于節(jié)省內(nèi)存,或在不同數(shù)據(jù)類型間轉(zhuǎn)換(如同時(shí)存儲(chǔ)int和float)。如何避免頭文件重復(fù)包含?使用預(yù)編譯指令:1.ifndef/define/endif:ifndef_HEADER_H_define_HEADER_H_//頭文件內(nèi)容endif2.pragmaonce(部分編譯器支持,如MSVC、GCC):pragmaonce//頭文件內(nèi)容前者是標(biāo)準(zhǔn)方法,跨平臺(tái)兼容性好;后者更簡潔,但依賴編譯器實(shí)現(xiàn)。兩種方法均通過在第一次包含時(shí)定義宏(或標(biāo)記),后續(xù)包含時(shí)跳過內(nèi)容,避免重復(fù)定義(如結(jié)構(gòu)體、函數(shù)聲明)。如何實(shí)現(xiàn)兩個(gè)變量的交換?不使用臨時(shí)變量。方法1:算術(shù)運(yùn)算(適用于整數(shù)):a=a+b;b=ab;//此時(shí)b=(a+b)b=aa=ab;//此時(shí)a=(a+b)a=b方法2:位運(yùn)算(適用于整數(shù),無溢出風(fēng)險(xiǎn)):a=a^b;b=a^b;//等價(jià)于(a^b)^b=aa=a^b;//等價(jià)于(a^b)^a=b注意:若a和b指向同一塊內(nèi)存(如交換數(shù)組中同一元素),算術(shù)運(yùn)算會(huì)導(dǎo)致a和b變?yōu)?,位運(yùn)算會(huì)導(dǎo)致a和b變?yōu)?(因a^a=0),需先判斷是否為同一地址。內(nèi)存分配失敗時(shí)malloc的返回值是什么?如何處理?malloc分配失敗時(shí)返回NULL指針(在標(biāo)準(zhǔn)C中)。因此,動(dòng)態(tài)分配后必須檢查返回值是否為NULL,避免對NULL指針解引用導(dǎo)致崩潰。例如:charp=(char)malloc(1024);if(p==NULL){perror("mallocfailed");//打印錯(cuò)誤信息(如“Notenoughmemory”)exit(EXIT_FAILURE);//或進(jìn)行其他錯(cuò)誤處理}//使用p...free(p);p=NULL;//防止懸空指針在嵌入式系統(tǒng)中,可能禁用exit函數(shù),需根據(jù)具體場景處理(如返回錯(cuò)誤碼、重新分配較小內(nèi)存)。函數(shù)參數(shù)的壓棧順序是怎樣的?C語言中函數(shù)參數(shù)的壓棧順序是從右到左(Right-to-Left)。例如調(diào)用func(a,b,c),壓棧順序?yàn)閏→b→a。這是因?yàn)镃允許可變參數(shù)函數(shù)(如printf),從右到左壓??杀WC最左邊的參數(shù)(格式字符串)在棧頂,便于通過棧指針偏移訪問后續(xù)參數(shù)。例如:voidfunc(inta,intb,intc){//棧中順序:c(高地址)→b→a(低地址)}intmain(){func(1,2,3);return0;}壓棧順序由調(diào)用約定決定(如__cdecl、__stdcall),但C默認(rèn)的__cdecl是從右到左。如何判斷一個(gè)數(shù)是否為2的冪?2的冪的二進(jìn)制表示中只有1個(gè)1(如2=10,4=100,8=1000)。利用n&(n-1)的特性:若n是2的冪,則n&(n-1)=0(例如8&7=0)。注意n=0時(shí)需特殊處理(0不是2的冪)。boolis_power_of_two(intn){returnn>0&&(n&(n1))==0;}如何實(shí)現(xiàn)strcpy函數(shù)?需考慮源字符串和目標(biāo)字符串的重疊情況(如目標(biāo)字符串在源字符串之后),并確保目標(biāo)空間足夠。標(biāo)準(zhǔn)strcpy不處理重疊,需使用memmove。手動(dòng)實(shí)現(xiàn):charmy_strcpy(chardest,constcharsrc){if(dest==NULL||src==NULL)returnNULL;charret=dest;while((dest++=src++)!='\0');//復(fù)制直到'\0'returnret;}若源和目標(biāo)重疊(如dest=src+1),會(huì)導(dǎo)致源字符串被覆蓋,需先判斷是否重疊,或使用memmove(內(nèi)部處理了重疊情況)。volatile關(guān)鍵字的作用是什么?volatile告知編譯器變量可能被意外修改(如硬件寄存器、多線程共享變量),禁止編譯器對其進(jìn)行優(yōu)化(如緩存到寄存器、省略重復(fù)讀?。?。例如:volatileintreg=0x1234;//硬件寄存器,值可能被外部電路修改while(reg==0);//若不加volatile,編譯器可能優(yōu)化為讀取一次reg,陷入死循環(huán)常見使用場景:中斷服務(wù)程序中的共享變量、內(nèi)存映射的硬件寄存器、多線程中的共享變量。如何實(shí)現(xiàn)一個(gè)簡單的內(nèi)存池?內(nèi)存池通過預(yù)先分配大塊內(nèi)存,減少頻繁malloc/free的開銷,避免內(nèi)存碎片?;静襟E:1.定義內(nèi)存塊結(jié)構(gòu)(包含起始地址、大小、是否空閑);2.初始化時(shí)分配一大塊內(nèi)存,分割為固定大小的塊;3.分配時(shí)查找空閑塊,標(biāo)記為已使用;4.釋放時(shí)標(biāo)記塊為空閑,可選合并相鄰空閑塊(減少碎片)。示例結(jié)構(gòu):structMemBlock{size_tsize;//塊大小intis_free;//是否空閑structMemBlocknext;//下一個(gè)塊指針};structMemPool{structMemBlockhead;//內(nèi)存塊鏈表頭voidstart_addr;//內(nèi)存池起始地址size_ttotal_size;//總大小};初始化內(nèi)存池時(shí),分配total_size的內(nèi)存,創(chuàng)建初始MemBlock(size為total_sizesizeof(MemBlock),is_free=1)。分配時(shí)遍歷鏈表,找到足夠大的空閑塊,若塊大小大于需求,分割為使用塊和剩余空閑塊。釋放時(shí)標(biāo)記is_free=1,遍歷前后塊合并。如何處理C語言中的可變參數(shù)?使用<stdarg.h>中的宏:va_list(保存參數(shù)列表)、va_start(初始化參數(shù)列表,指向第一個(gè)可選參數(shù))、va_arg(獲取當(dāng)前參數(shù)并移動(dòng)到下一個(gè))、va_end(結(jié)束參數(shù)列表訪問)。例如實(shí)現(xiàn)求和函數(shù):intsum(intnum,...){va_listargs;va_start(args,num);//num是最后一個(gè)固定參數(shù)inttotal=0;for(inti=0;i<num;i++){total+=va_arg(args,int);//獲取int類型參數(shù)}va_end(args);returntotal;}調(diào)用:sum(3,1,2,3)返回6。注意:va_arg需指定正確的類型(與實(shí)際參數(shù)匹配),否則導(dǎo)致未定義行為。大端序和小端序在網(wǎng)絡(luò)傳輸中的處理?網(wǎng)絡(luò)字節(jié)序(NetworkByteOrder)采用大端序,主機(jī)字節(jié)序(HostByteOrder)可能是大端或小端。發(fā)送數(shù)據(jù)時(shí)需將主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序(htons/htonl),接收時(shí)轉(zhuǎn)換為主機(jī)字節(jié)序(ntohs/ntohl)。例如:uint16_thost_port=8080;uint16_tnet_port=htons(host_port);//轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序(大端)//網(wǎng)絡(luò)傳輸net_port...uint16_trecv_port=ntohs(net_port);//轉(zhuǎn)換回主機(jī)字節(jié)序htons(hosttonetworkshort)處理16位,htonl處理32位,ntohs/ntohl是逆操作。如何檢測內(nèi)存越界訪問?常見方法:1.工具檢測:Valgrind的memcheck可檢測越界;2.編譯器選項(xiàng):GCC的-fsanitize=address(ASan)在運(yùn)行時(shí)檢測越界;3.手動(dòng)保護(hù):在分配的內(nèi)存前后添加哨兵值(如0xDEADBEEF),釋放時(shí)檢查哨兵是否被修改;4.調(diào)試版本處理:malloc在調(diào)
溫馨提示
- 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)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年山東大學(xué)齊魯?shù)诙t(yī)院護(hù)理人員(非事業(yè)編制)招聘(60人)筆試備考題庫及答案解析
- 2026上半年貴州事業(yè)單位聯(lián)考貴州省民政廳招聘10人考試備考題庫及答案解析
- 2026年度霍邱縣事業(yè)單位公開招聘工作人員44名筆試模擬試題及答案解析
- 2026年安徽汽車職業(yè)技術(shù)學(xué)院招聘派遣制任務(wù)型教師30名(第一批)筆試參考題庫及答案解析
- 2026湖北恩施州順鑫達(dá)勞務(wù)有限責(zé)任公司短期招聘2人筆試參考題庫及答案解析
- 2026年薪酬體系設(shè)計(jì)優(yōu)化培訓(xùn)
- 2026江西裕民銀行誠聘英才筆試備考試題及答案解析
- 北京十一晉元中學(xué)招聘筆試備考題庫及答案解析
- 2026年投資房地產(chǎn)的地理經(jīng)濟(jì)分析
- 2026年房地產(chǎn)開發(fā)成本與政策調(diào)控的關(guān)聯(lián)性
- DB34-T 4877-2024 智慧檢驗(yàn)檢測實(shí)驗(yàn)室建設(shè)指南
- 體溫單模板完整版本
- 武漢市2024屆高中畢業(yè)生二月調(diào)研考試(二調(diào))英語試卷(含答案)
- 天然美肌無添加的護(hù)膚品
- 《正常人體形態(tài)學(xué)》考試復(fù)習(xí)題庫大全(含答案)
- 湖南省長沙市外國語學(xué)校 2021-2022學(xué)年高一數(shù)學(xué)文模擬試卷含解析
- 3D車載蓋板玻璃項(xiàng)目商業(yè)計(jì)劃書
- 阿米巴經(jīng)營管理培訓(xùn)課件
- 我國的宗教政策-(共38張)專題培訓(xùn)課件
- 鋁材廠煲模作業(yè)指導(dǎo)書
- 【行測題庫】圖形推理題庫
評論
0/150
提交評論