c與c++面試題匯總_第1頁(yè)
c與c++面試題匯總_第2頁(yè)
c與c++面試題匯總_第3頁(yè)
c與c++面試題匯總_第4頁(yè)
已閱讀5頁(yè),還剩48頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C語(yǔ)言.static有什么用途?(請(qǐng)至少說(shuō)明兩種)1)限制變量的作用域2)設(shè)置變量的存儲(chǔ)域.引用與指針有什么區(qū)別?1)引用必須被初始化,指針不必。2)引用初始化以后不能被改變,指針可以改變所指的對(duì)象。3)不存在指向空值的引用,但是存在指向空值的指針。3,描述實(shí)時(shí)系統(tǒng)的基本特性在特定時(shí)間內(nèi)完成特定的任務(wù),實(shí)時(shí)性與可靠性.全局變量和局部變量在內(nèi)存中是否有區(qū)別?如果有,是什么區(qū)別?全局變量?jī)?chǔ)存在靜態(tài)數(shù)據(jù)庫(kù),局部變量在堆棧.堆棧溢出一般是由什么原因?qū)е碌?沒有回收垃圾資源.什么函數(shù)不能聲明為虛函數(shù)?constructor(虛函數(shù)在構(gòu)造函數(shù)中不起作用).寫出(loatx與“?值?比較的if語(yǔ)句?if(x>0.000001&&x<-0000001).Internet采用哪種網(wǎng)絡(luò)協(xié)議?該協(xié)議的主要層次結(jié)構(gòu)?tcp/ip應(yīng)用層ノ傳輸層/網(wǎng)絡(luò)層/數(shù)據(jù)鏈路層/物理層.Internet物理地址和IP地址轉(zhuǎn)換采用什么協(xié)議?ARP(AddressResolutionProtocol)(地址解析協(xié)議).IP地址的編碼分為哪倆部分?IP地址由兩部分組成,網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)。不過是要和“子網(wǎng)掩碼”按位與上之后才能區(qū)分哪些是網(wǎng)絡(luò)位哪些是主機(jī)位。.用戶輸入M,N值,從1至N開始順序循環(huán)數(shù)數(shù),每數(shù)到M輸出該數(shù)值,直至全部輸出。寫出C程序。循環(huán)鏈表,用取余操作做.不能做switch。的參數(shù)類型是:switch的參數(shù)不能為實(shí)型。.局部變量能否和全局變量重名?答:能,局部會(huì)屏蔽全局。要用全局變量,需要使用"::"局部變量可以與全局變量同名,在函數(shù)內(nèi)引用這個(gè)變量時(shí),會(huì)用到同名的局部變量,而不會(huì)用到全局變量。對(duì)于有些編譯器而言,在同一個(gè)函數(shù)內(nèi)可以定義多個(gè)同名的局部變量,比如在兩個(gè)循環(huán)體內(nèi)都定義ー個(gè)同名的局部變量,而那個(gè)局部變量的作用域就在那個(gè)循環(huán)體內(nèi)14,如何引用ー個(gè)已經(jīng)定義過的全局變量?答:extern可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來(lái)引用某個(gè)在頭文件中聲明的全局變理,假定你將那個(gè)變寫錯(cuò)了,那么在編譯期間會(huì)報(bào)錯(cuò),如果你用extern方式引用時(shí),假定你犯了同樣的錯(cuò)誤,那么在編譯期間不會(huì)報(bào)錯(cuò),而在連接期間報(bào)錯(cuò)可以在不同的C文件中聲明同名的全局變量,前提是其中?能有一個(gè)Cエ件中對(duì)此變量賦初值,此時(shí)逹接不會(huì)出錯(cuò)

.語(yǔ)句for(;1:)有什么問題?它是什么意思?答:和whHe(1)相同。.do....while和while....do有什么區(qū)別?答:前ー個(gè)循環(huán)?遍再判斷,后ー個(gè)判斷以后再循環(huán).請(qǐng)寫出下列代碼的輸出內(nèi)容#include<stdio.h>main(){inta,b,c,d;a=10;b=a++;c=++a;d=10*a++;printf(Hb,c,d:%d,%d,%d",b,c,d);return0;)答:10,12,120.static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別?static函數(shù)與普通函數(shù)有什么區(qū)別?全局變量(外部變量)的說(shuō)明之前再冠以static就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲(chǔ)方式,靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式。這兩者在存儲(chǔ)方式上并無(wú)不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個(gè)源程序,當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的。而靜態(tài)全局變量則限制了其作用域,即只在定義該變量的源文件內(nèi)有效,在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域同限于ー個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯(cuò)誤。從以上分析可以看出,把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。static函數(shù)與普通函數(shù)作用域不同。僅在本文件。只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說(shuō)明為內(nèi)部函數(shù)(static),內(nèi)部函數(shù)應(yīng)該在當(dāng)前源文件中說(shuō)明和定義。對(duì)于可在當(dāng)前源文件以外使用的函數(shù),應(yīng)該在ー個(gè)頭文件中說(shuō)明,要使用這些函數(shù)的源文件要包含這個(gè)頭文件static全局變量與普通的全局變量有什么區(qū)別:static全局變量只初使化一次,防止在其他文件單元中被引用;static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化?次,下一次依據(jù)上?次結(jié)果值;static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持ー份拷貝.程序的局部變量存在于(堆棧)中,全局變量存在于(靜態(tài)區(qū))中,動(dòng)態(tài)申請(qǐng)數(shù)據(jù)存在于(堆)中。.設(shè)有以下說(shuō)明和定義:typedefunion{longi;intk[5];charc;}DATE;structdata{intcat;DATEcow;doubledog;}too;DATEmax;則語(yǔ)句printf("%d",sizeof(structdate)+sizeof(max));的執(zhí)行結(jié)果是: 52 答:DATE是ー個(gè)union,變量公用空間.里面最大的變量類型是int[5],占用20個(gè)字節(jié).所以它的大小是20

data是ー個(gè)struct,每個(gè)變量分開占用空間.依次為int4+DATE20+doubled=32.所以結(jié)果是20+32=52.批注[wh31]:看到這了當(dāng)然…在某些16位編輯器下,int可能是2字節(jié),那么結(jié)果是int2+DATE10+doubles=20批注[wh31]:看到這了#include<stdio.h>intinc(inta)(return(++a);)intmultifint*a,int*b,int*c){return(*c=*a**b);)typedefint(FUNC1)(intin);typedefint(FUNC2)(int*,int*,int*);voidshow(FUNC2fun,intarg1,int*arg2)(INCp=&inc;inttemp=p(arg1);fun(&temp,&arg1,arg2);printf("%d\n,,,*arg2);}main(){inta;show(multi,10,&a);return0;)答:11023.請(qǐng)找出下面代碼中的所以錯(cuò)誤說(shuō)明:以下代碼是把,個(gè)字符串倒序,如“abed”倒序后變?yōu)椤癲cba”1、#include"string.h"2、main()3、(4、char*src="hello,world',;5、char*dest=NULL;intlen=strlen(src);7、dest=(char*)malloc(len);d、char*d=dest;9、char*s=src[len];10、while(len--l=0)

11、d++=s--;12、printf("%s",dest);13、return0;14、1答:方法1:intmain(){char*src="hello,world";intlen=strlen(src);char*dest=(char*)malloc(len+1);〃要為、。分配ー個(gè)空間char*d=dest;char*s=&src[len-1];〃指向最后一個(gè)字符while(len--!=0)d++=*s--;d=。;〃尾部要加、。printf("%s'n",dest);freezes。;〃使用完,應(yīng)當(dāng)釋放空間,以免造成內(nèi)存匯泄露return0;)方法2:include<stdio.h>include<string.h>main(){charstr[]="hello,world";intlen=strlen(str);■數(shù)名:atol功能:把字符串轉(zhuǎn)換成K整型數(shù)用(L:longatol(constchar*nptr);程序例:include<stdlib.h>include<stdio.h>intmain(void)(longI;char*str="98765432";I=atol(lstr);printf("string=%sinteger=%ld'n",str,I);return(O);}25.對(duì)于ー個(gè)頻繁使用的短小函數(shù),在C語(yǔ)言中應(yīng)用什么實(shí)現(xiàn),在C++中應(yīng)用什么實(shí)現(xiàn)?用宏定義,c++用inline

26,貞接徒接兩個(gè)信令點(diǎn)的ー組鏈路稱作什么?PPP點(diǎn)到點(diǎn)連接27,接入網(wǎng)用的是什么接口?.voip都用了那些協(xié)議?.軟件測(cè)試都有那些種類?黑盒:針對(duì)系統(tǒng)功能的測(cè)試白合:測(cè)試函數(shù)功能,各函數(shù)接口.確定模塊的功能和模塊的接口是在軟件設(shè)計(jì)的那個(gè)隊(duì)段完成的?概要設(shè)計(jì)階段.enumstring(x1,x2tx3=10,x4tx5,)x;問x=0x801005,0x8010(4;.unsignedchar*p1;unsignedlong*p2;p1=(unsignedchar*)0x801000;p2=(unsignedlong*)0x810000;請(qǐng)問p1+5=;p2+5=;.三.選擇題:.Ethternet鮭接到Internet用到以下那個(gè)協(xié)議?A.HDLC;B.ARP;C.UDP;D.TCP;E.lD.屬于網(wǎng)絡(luò)層協(xié)議的是:A.TCP;B.IP;C.ICMP;D.X,25.Windows消息調(diào)度機(jī)制是:A.指令隊(duì)列;B.指令堆棧;C.消息隊(duì)列;D.消息堆棧;unsignedshorthash(unsignedshortkey)■return(key>>)%256I請(qǐng)問hash(16),hash(256)的值分別是:A.1.16;B.8.32;C.4.16;D.1.32四.找錯(cuò)題:1.請(qǐng)問ド面程序有什么錯(cuò)誤?inta[60][250][1000],i,j,k;for(k=0;k<=1000;k++)for(j=0;j<250;j++)for(i=0;i<60;i++)a[i][j][k]=O;把循環(huán)語(yǔ)句內(nèi)外換?下

H#defineMax_CB500voidLmiQueryCSmd(StructMSgCB*pmsg){unsignedcharucCmdNum;for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++))死循環(huán).以下是求?個(gè)數(shù)的平方的程序,諭找出錯(cuò)誤:#defineSQUARE(a)((a)*(a))inta=5;intb;b=SQUARE(a++); 輸出為a=7,b=25.有錯(cuò)嗎?.typedefunsignedcharBYTEintexamply_fun(BYTEgt_len;BYTE*gt_code){BYTE*gt_buf;gt_buf=(BYTE*)MALLOC(Max_GT_Length);if(gt_len>Max_GT_Length){returnGT_Length_ERROR;)}五.問答題:1.IPPhone的原理是什么?IPV62.TCPハP通信建立的過程怎樣,端口有什么作用?三次握手,確定是哪個(gè)應(yīng)用程序使用該協(xié)議3.1號(hào)信令和7號(hào)信令有什么區(qū)別,我國(guó)某前廣泛使用的是那一種?4.列舉5種以上的電話新業(yè)務(wù)?微軟亞洲技術(shù)中心的面試題!??!.進(jìn)程和線程的差別。

線程是指進(jìn)程內(nèi)的ー個(gè)執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體.與進(jìn)程的區(qū)別:(1)調(diào)度:線程作為調(diào)度和分配的基本單位,進(jìn)程作為擁有資源的基本單位(2)并發(fā)性:不僅進(jìn)程之間可以并發(fā)執(zhí)行,同一個(gè)進(jìn)程的多個(gè)線程之間也可并發(fā)執(zhí)行(3)擁有資源:進(jìn)程是擁有資源的一個(gè)獨(dú)立單位,線程不擁有系統(tǒng)資源,但可以訪問隸屬于進(jìn)程的資源.(4)系統(tǒng)開銷:在創(chuàng)建或撤消進(jìn)程時(shí),由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時(shí)的開銷。.測(cè)試方法人工測(cè)試:個(gè)人復(fù)査、抽査和會(huì)審機(jī)器測(cè)試:黑盒測(cè)試和白盒測(cè)試.Heap與stack的,別。Heap是堆,stack是棧。Stack的ぐ間由操?系統(tǒng)?動(dòng)分?■?放,HeapI??的?間手動(dòng)分配/釋放Stackズ間有限,Heap?很大的門由存儲(chǔ),C中的malloc,數(shù)分配的內(nèi)存空間即在堆i.G?■?中對(duì)應(yīng)的是new操作符.I.Windows下的內(nèi)存是如何管理的?.介紹.Net和.Net的安全性。.客戶端如何訪問.Net組件實(shí)現(xiàn)WebService?.C/C++,?盟川?長(zhǎng)拈如何完成的?.談?wù)凜OM的線程模型。然后討論進(jìn)程內(nèi)/外組件的差別。.談?wù)処A32下的分頁(yè)機(jī)制小頁(yè)(4K)兩級(jí)分頁(yè)模式,大頁(yè)(4M)ー級(jí).在IA32中一共有多少種辦法從用戶態(tài)跳到內(nèi)核態(tài)?通過調(diào)用門,從ring3至hingO,中斷從ring3到ring。,進(jìn)入vm86等等.如果只想讓程序有?個(gè)實(shí)例運(yùn)行,不能運(yùn)行兩個(gè)。像winamp?樣,只能開ー個(gè)窗口,怎樣實(shí)現(xiàn)?用內(nèi)存映射或全局原子(互斥變量)、査找窗口句柄..FindWindow,互斥,寫標(biāo)志到文件或注冊(cè)表,共享內(nèi)存。..如何截取鍵盤的響應(yīng),讓所有的‘a(chǎn)‘變成七’?鍵盤鉤子SetWindowsHookEx.Apartment在COM中有什么用?為什么要引入?.存儲(chǔ)過程是什么?有什么用?有什么優(yōu)點(diǎn)?我的理解就是ー堆sql的集合,可以建立非常復(fù)雜的査詢,編譯運(yùn)行,所以運(yùn)行一次后,以后再運(yùn)行速度比單獨(dú)執(zhí)行SQL快很多.Template有什么特點(diǎn)?什么時(shí)候用?.談?wù)刉indowsDNA結(jié)構(gòu)的特點(diǎn)和優(yōu)點(diǎn)。網(wǎng)絡(luò)編程中設(shè)計(jì)并發(fā)服務(wù)器.使用多進(jìn)程與多線程,請(qǐng)問有什么區(qū)別?1,進(jìn)程:子進(jìn)程是父進(jìn)程的復(fù)制品。子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)制品。2,線程:相對(duì)與進(jìn)程而言,線程是ー個(gè)更加接近與執(zhí)行體的概念,它可以與同進(jìn)程的其他線程共享數(shù)據(jù),但擁有自己的??臻g,擁有獨(dú)立的執(zhí)行序列。

兩者都可以提高程序的并發(fā)度,提高程序運(yùn)行效率和響應(yīng)時(shí)間。線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小,但不利于資源管理和保護(hù);而進(jìn)程正相反。同時(shí),線程適合于在SMP機(jī)器上運(yùn)行,而進(jìn)程則可以跨機(jī)器遷移。思科.用宏定義寫出swap(x,y)#defineswap(x,y)\x=x+y;\y=X-y;\x=x-y;.數(shù)組a[N],存放了1至N-1個(gè)數(shù),其中某個(gè)數(shù)重復(fù)一次.寫一個(gè)函數(shù),找出被重復(fù)的數(shù)字必須為0(N)函數(shù)原型:intdodup(inta[],intN)inti=512;cout<<B,lalph|<<((i&(i-1))?false:true)<<endl;4.unsignedintintvert(unsignedintx,intp,intn)實(shí)現(xiàn)對(duì)x的進(jìn)行轉(zhuǎn)換,p為起始轉(zhuǎn)化位,n為需要轉(zhuǎn)換的長(zhǎng)度,假設(shè)起始點(diǎn)在右邊.如x=0b00010001,p=4,n=3轉(zhuǎn)換后x=0b01100001unsignedintintvert(unsignedintx,intp,intn){unsignedint_t=0;unsignedint_a=1;for(inti=0;i<n;++i){_tl=_a;_a=_a<<1;)_t=_t<<p;xA=_t;returnx;)慧通:什么是預(yù)編譯1、總是使用不經(jīng)常改動(dòng)的大型代碼體。2、程序由多個(gè)模塊組成,所有模塊都使用ー組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)。在這種情況下,可以將所有包含文件預(yù)編譯為ー個(gè)預(yù)編譯頭。char*constp;charconst*pconstchar*p上述二個(gè)有什么區(qū)別?char*constp;〃常量指針,p的值不可以修改charconst*pZ〃指向常量的指針,指向的常量值不可以改constchar*p:/ノ和charconst*p

charstr1[|-"abc".charstr2[]="abc":constcharstr3[]="abc";constcharstr4[]="abc";constchar#str5="abc"constchar*str6="abcchar*str7="abc":char*str8="abc";cout<< ( str1= - str2) << endl;cout<< ( str3= = str4) << endl:cout<< ( str5= = str6) << endl:cout<< ( str7== str8) << endl結(jié)果是:0011解答:st,1,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間:而st,5,str6,s,7,s,8是指針.它們指向機(jī)同的常で區(qū)域〃指針變量和數(shù)組變量的不同12.以下代碼中的兩個(gè)sizeof用法有問題嗎?[C易]voidUpperCase(charstr[])//將str中的小寫字母轉(zhuǎn)換成大寫字母(for(size_ti=0;i<sizeof(str)/sizeof(str[0]);++i)if('a'<=str[i]&&str[i]<=*z')str[i]-=Ca'-'A');}charstr[]="aBcDe";cout<<"str字符長(zhǎng)度為:"<<sizeof(str)/sizeof(str[0])<<endl;UpperCase(str);cout<<str<<endl;答:函數(shù)內(nèi)的sizeof(問題.根據(jù)戴法,sizeof如用于數(shù)組,只能測(cè)出靜態(tài)數(shù)組的大小,無(wú)法檢測(cè)動(dòng)態(tài)分配的或外部數(shù)溫大小J函數(shù)外的str是ー個(gè)靜態(tài)定義的數(shù)組,因此其大小為6,函數(shù)內(nèi)的str實(shí)際只是ー個(gè)指向字符串的指針,沒有任何額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,ー個(gè)指針為4個(gè)字節(jié),因此返回4.ー個(gè)32位的機(jī)器,該機(jī)器的指針是多少位指針是多少位只要看地址總線的位數(shù)就行了.80386以后的機(jī)子都是32的數(shù)據(jù)總線。所以指針的位數(shù)就心4個(gè)字節(jié)了。

HHH■inta[5]=I1,2,3,4,5):int*ptr=(int*){&a+1).printf("%d.%d",*(a+1),*(ptr-1)).a M—*(a+1)就是a。], 就是?4,執(zhí)行結(jié)果是2,5int*ptr=(mt*)(&a+1).則ptr實(shí)際是&(a[5]),也就是a+5原因如下:&au數(shù)組指針,■1號(hào)為int,)[5];而指針加1耍根據(jù)擰?類型加上一定的值,不同類セ的指針+1之ズ?加的大小不同a是長(zhǎng)度為5的int數(shù)組指針,所以要加5*sizeof(int)所以ptr實(shí)際是a[5]所以prt-1”會(huì)減去sizeof(inf)aaaaBaaaa^—aiMaMaMaai^^^^^^^Mi^M1.請(qǐng)問以下代碼有什么問題:intmain()(chara;char*str=&a;strcpy(str,"hello");printf(str);return0;)沒行為s"分配內(nèi),空間,將公發(fā)生異常橫寫向?qū)е鲁踏操|(zhì)潰怎樣修改??????char*s="AAA";printf("%s",s);s[0]='B,;printf("%s",s);

有什么錯(cuò)?"AAA"是::符串,鼠s是指針,指向這個(gè)オ符串常,,所以聲明8的時(shí),就有問題.cosntchar*s="AAAH;hhhhhhhhhh^hhi^h1、寫ー個(gè)“標(biāo)準(zhǔn)”宏,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的ー個(gè)。.#defineMin(XtY)((X)>(Y)?(Y):(X))〃結(jié)尾沒有;2、嵌入式系統(tǒng)中經(jīng)常要用到無(wú)限循環(huán),你怎么用C編寫死循環(huán)。while(1){}或者for(;;)3、關(guān)鍵字static的作用是什么?定義靜態(tài)變量4、關(guān)健字const有什么含意?表示常量不可以修改的變量。5、關(guān)鍵字volatile有什么含意?并舉出三個(gè)不同的例子?提示編譯器對(duì)象的值可能在編譯器未監(jiān)測(cè)到的情況下改變。int(*s[10])(int)表示的是什么啊int(*s[10])(int)函數(shù)指針數(shù)組,每個(gè)指針指向?個(gè)intfunc(intparam)的函數(shù)。.有以下表達(dá)式:inta=248;b=4;intconstc=21;constint*d=&a;int*conste=&b;intconst*fconst=&a;請(qǐng)問卜.列表達(dá)式哪些會(huì)被編譯器禁止?為什么?*c=32;d=&b;*d=43;*e=34;e=&a;f=0x321f;?c這是個(gè)什么東東,禁止*d說(shuō)了是const,禁止e=&a說(shuō)了是const禁止const*fconst=&a;禁止.交換兩個(gè)變量的值,不使用第三個(gè)變量。即a=3,b=5,交換之后a=5,b=3;有兩種解法,?種用算術(shù)算法,ー種用人(異或)a=a+b;b=a-b;a=a-b;ora=aAb;// int,char.b=a"b;a=a"b:■aA=bA=a;.c和c++中的struct有什么不同?

c和c++中struct的主要區(qū)別是c中的struct不可以含有成員函數(shù),而c++中的struct可以。c++中struct和class的主要區(qū)別在于默認(rèn)的存取權(quán)限不同,struct默認(rèn)為public,而class默認(rèn)為private.#include<stdio.h>#include<stdlib.h>voidgetmemoryfchar*p)■p=(char*)malloc(100):strcpy(p.helloworld")■intmam()■char*str=NULL.getmemory(str);printf("%s/n",str):free(str).I 程,崩潰,getmemory中的malloc不能返回動(dòng)態(tài)內(nèi)存,free()對(duì)str^HIM????????程序沒有崩潰。輸出得不到期望的結(jié)果,getmemory()函數(shù)沒有作用,輸出為vnull>/n.charszstr[10]strcpy(szstr,,0123456789");〃運(yùn)行并沒有岀錯(cuò)阿??????.列舉幾種進(jìn)程的同步機(jī)制,并比較其優(yōu)缺點(diǎn)。原子操作信號(hào)量機(jī)制自旋鎖管程,會(huì)合,分布式系統(tǒng).進(jìn)程之間通信的途徑共享存儲(chǔ)系統(tǒng)消息傳遞系統(tǒng)管道:以文件系統(tǒng)為基礎(chǔ).進(jìn)程死鎖的原因資源競(jìng)爭(zhēng)及進(jìn)程推進(jìn)順序非法.死鎖的4個(gè)必要條件互斥、請(qǐng)求保持、不可剝奪、環(huán)路.死鎖的處理鴕鳥策略、預(yù)防策略、避免策略、檢測(cè)ヮ解除死鎖15.操作系統(tǒng)中進(jìn)程調(diào)度策略有哪幾種?

FCFS(先來(lái)先服務(wù)),優(yōu)先級(jí),時(shí)間片輪轉(zhuǎn),多級(jí)反饋.類的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?類的靜態(tài)成員每個(gè)類只有一個(gè),非靜態(tài)成員每個(gè)對(duì)象一個(gè).純虛函數(shù)如何定義?使用時(shí)應(yīng)注意什么?virtualvoidf()=0;是接口,子類必須要實(shí)現(xiàn)12.IS0的七層模型是什么?tcp/udp是屬于哪?層?tcp/udp有何優(yōu)缺點(diǎn)?應(yīng)用層表示層會(huì)話層運(yùn)輸層網(wǎng)絡(luò)層物理鏈路層物理層tcp/udp屬于?運(yùn)輸層TCP服務(wù)提供了數(shù)據(jù)流傳輸、可靠性、疔效流控制、全雙工操作和多路復(fù)用技術(shù)等。與TCP不同,UDP并不提供對(duì)IP協(xié)議的可靠機(jī)制、流控制以及錯(cuò)誤恢復(fù)功能等。由于UDP比較簡(jiǎn)單,UDP頭包含很少的字節(jié),比TCP負(fù)載消耗少。tcp:提供穩(wěn)定的傳輸服務(wù),有流量控制,缺點(diǎn)是包頭大,冗余性不好udp:不提供穩(wěn)定的服務(wù),包頭小,開銷小1:(void*)ptr和("(void一))ptr的結(jié)果是否相同?其中ptr為同一個(gè)指針.(void*)ptr和(*(void**))ptr值是相同的2:intmain()(intx=3;printf("%d",x);return1;)問函數(shù)既然不會(huì)被其它函數(shù)調(diào)用,為什么要返回1?Eian中,c標(biāo)準(zhǔn)認(rèn)為。表示成功,非。表示錯(cuò)誤。具體的值是某中具體出錯(cuò)信息,要對(duì)絕對(duì)地址。)(1。。。。。賦侑,我『"以用(unsignedint*)0x100000=1234那么要是想,程序跳轉(zhuǎn)到絕對(duì)地址是0x100000,執(zhí)行,應(yīng)該怎么做????為什么?(void(?)1))0x100000然后再調(diào)用它:

,((void(*)0)0x100000)(),用typed,可以看,更直觀些:typedefvoidC)0voidFuncPtr;,((voidFuncPtr)0x100000)();.已知一個(gè)數(shù)組table,用ー個(gè)宏定義,求出數(shù)據(jù)的元素個(gè)數(shù)#defineNTBL#defineNTBL(sizeof(table)/sizeof(table[0]))我的答案:#defineNTBL(TABLE)\cout<<#TABLE<<sizeof(table)/sizeof(table[0])<<endl;\面試題:線程與進(jìn)程的區(qū)別和聯(lián)系?線程是否具有相同的堆棧?dll是否有獨(dú)立的堆棧?進(jìn)程是死的,只是一些資源的集合,真正的程序執(zhí)行都是線程來(lái)完成的,程序啟動(dòng)的時(shí)候操作系統(tǒng)就幫你創(chuàng)建了一個(gè)主線程。毎個(gè)線程有自己的堆棧。DLL中有沒有獨(dú)立的堆?!@個(gè)問題不好回答,或者說(shuō)這個(gè)問題本身是否有問題。因?yàn)镈LL中的代碼是被某些線程所執(zhí)行,只有線程擁有堆棧,如果DLL中的代碼是EXE中的線程所調(diào)用,那么這個(gè)時(shí)候是不是說(shuō)這個(gè)DLL沒有自己獨(dú)立的堆棧?如果DLL中的代碼是由DLL自己創(chuàng)建的線程所執(zhí)行,那么是不是說(shuō)DLL有獨(dú)立的堆棧?以上講的是堆棧,如果對(duì)于堆來(lái)說(shuō),每個(gè)DLL有自己的堆,所以如果是從DLL中動(dòng)態(tài)分配的內(nèi)存,最好是從DLL中刪除,如果你從DLL中分配內(nèi)存,然后在EXE中,或者另外一個(gè)DLL中刪除,很有可能導(dǎo)致程序崩潰分析下面的程序:voidGetMemory(char**p,intnum)(*p=(char*)malloc(num);}intmain()(char?str=NULL;GetMemory(&str,100);strcpy(str,"hello");free(str);

if(str!=NULL)(strcpy(str,Hworld");printf("\nstris%s",str);getchar();)問輸出結(jié)果是什么?希望大家能說(shuō)說(shuō)原因,先謝謝了輸出strisworld.free只是釋放的str指向的內(nèi)存空間,它本身的值還是存在的.所以free之后,有一個(gè)好的習(xí)慣就是將str=NULL.此時(shí)str指向空間的內(nèi)存已被回收,如果輸出語(yǔ)句之前還存在分配空間的操作的話,這段存儲(chǔ)空間是可能被重新分配給其他變量的,盡管這段程序確實(shí)是存在大大的問題(上面各位己經(jīng)說(shuō)得很清楚了),但是通常會(huì)打印出world來(lái)。這是因?yàn)?當(dāng)你mallocー塊內(nèi)存的時(shí)候,管理摩向操作系統(tǒng)申請(qǐng)ー塊空間(可能會(huì)比你申請(qǐng)的大一些),然后在這塊空間中記錄ー些管理信息(一般是在你申請(qǐng)的內(nèi)存前面一點(diǎn)),并將可用內(nèi)存的地址返回。但是釋放內(nèi)存的時(shí)候,管理庫(kù)通常都不會(huì)將內(nèi)存還給操作系統(tǒng),因此你是可以繼續(xù)訪問這塊地址的,只不過 樓上都說(shuō)過了,最好別這么干。charCstr)[20];/*strにー個(gè)?組指",即指;?)數(shù)組的指???/char*str[20];/-str;Zー個(gè)指針數(shù)組.乂兀素為指針―;longa=0x801010;a+5=?0x801010用二進(jìn)制表示為:“100000000001000000010000",十進(jìn)制的值為839272〇,再加上5就是8392725羅2)ド面的函數(shù)實(shí)現(xiàn)在ー個(gè)數(shù)上加一個(gè)數(shù),有什么錯(cuò)誤?請(qǐng)改正。intadd_n(intn)(staticinti=100;i+=n;returni;)當(dāng)你第二次調(diào)用時(shí)得不到正確的結(jié)果,難道你寫個(gè)函數(shù)就是為了調(diào)用一次?問題就出在static上?/Z幫忙分析一下

mta,b,cHHfcga+b,イ;longin?關(guān)^booladd(inta,intb,int,c)■*c=a+breturn(a>0&&b>0&&(*c<a11*c<b)11(a<0&&b<0&&(?c>a11*c>b))):下面這個(gè)程序執(zhí)行后會(huì)有什么錯(cuò)誤或者效果:#defineMAX255intmain()|unsignedcharA[MAX],i;//i被定義為unsignedcharfor(i=0;i<=MAX;i++)A[i]=i;}解答:(C心+不進(jìn)行數(shù)組越界檢査)MAX=255數(shù)組A的下標(biāo)范圍為:0..MAX-1,這是其ー..其二.當(dāng)i循環(huán)到255時(shí),循環(huán)內(nèi)執(zhí)行:A[255]=255;這句本身沒有問題..但是返冋f(shuō)or(i=();iv=MAX;i++)語(yǔ)句時(shí),由于unsignedchar的取值范圍在(0..255),i++以后i又為〇了..無(wú)限循環(huán)下去.■char類型為ー個(gè)字節(jié),取值范圍是[-128,127],unsignedchar[0,255]intel:A.c和B.c兩個(gè)c文件中使用了兩個(gè)相同名字的static變量,編譯的時(shí)候會(huì)不會(huì)有問題?這兩個(gè)static變量會(huì)保存到哪里(棧還是堆或者其他的)?static的全局變量,表明這個(gè)變量?jī)H在本模塊中有意義,不會(huì)影響其他模塊。他們都放在數(shù)據(jù)區(qū),但是編譯器對(duì)他們的命名是不同的。如果要使變量在其他模塊也有意義的話,需要使用extern關(guān)鍵字。2.voidg(int**);intmain(){intline[10]J;int"p=line;〃p是地址的地址for(i=0;i<10;i++)(*p=i;g(&p);〃數(shù)組對(duì)應(yīng)的值加1)for(i=0;i<10;i++)printf("%d\nMine[i]);return〇;)voidg(int**p)((**P)++;(*p)++;〃無(wú)效)輸出:.寫出程序運(yùn)行結(jié)果intsum(inta)autointc=0;staticintb=3;c+=1;b+=2;return(a+b+c);)voidmain()(intI;inta=2;for(l=0;l<5;l++){printf("%d,",sum(a));})//static會(huì)保存上次結(jié)果,記住這一點(diǎn),剰下的自己寫輸出:8,10,12,14,16,.intfunc(inta){intb;switch(a){30;20;16;default:0)returnb;)則func(1)=?//b定義后就沒有賦值。5:inta[3];a[0]=〇;a[1]=1;a[2]=2;int*p,*q;p=a;q=&a[2];則a[q-p]=a[2]解釋:指針ー次移動(dòng)ー個(gè)int但計(jì)數(shù)為1今天早上的面試題9道,比較難,向牛人請(qǐng)教,國(guó)內(nèi)的ー牛公司,坐落在北京北四環(huán)某大廈:5、編寫ーunix程序,防止僵尸進(jìn)程的出現(xiàn).Top回復(fù)人:free131(白日?做夢(mèng)!)()信譽(yù):100200641710:17:34得分:。?同學(xué)的4道面試題,應(yīng)聘的職位是搜索引撃工程師,后兩道超級(jí)難,(希望大家多給一些算發(fā))1.給兩個(gè)數(shù)組和他們的大小,還有?動(dòng)態(tài)開辟的內(nèi)存,求交集,把交集放到動(dòng)態(tài)內(nèi)存dongtai,并且返冋交集個(gè)數(shù)longjiaoji(long*a[]Jongb[]Jong*alengthjongblengthJong*dongtai[]).可怕的題目終于來(lái)了象搜索的輸入信息是ー個(gè)字符串,統(tǒng)計(jì)300萬(wàn)輸入信息中的最熱門的前十條,我們每次輸入的一個(gè)字符串為不超過255byte?內(nèi)存使用只有1G,請(qǐng)描述思想,寫出算發(fā)(C語(yǔ)言),空間和時(shí)間復(fù)雜度,.國(guó)內(nèi)的ー些帖吧,如baidu,有幾十萬(wàn)個(gè)主題,假設(shè)毎一個(gè)主題都有上億的跟帖子,怎么樣設(shè)計(jì)這個(gè)系統(tǒng)速度最好,請(qǐng)描述思想,寫出算發(fā)(c語(yǔ)言),空間和時(shí)間復(fù)雜度,#includestring.hmain(void){char*src="hello,world";char*dest=NULL;dest=(char*)malloc(strlen(src));intlen=strlen(str);char*d=dest;char*s=src[len];while(len--l=0)d++=s--;printf("%s",dest);)找出錯(cuò)誤!!#include"string.h"#include"stdio.h"#include"malloc.h"main(void)|char*src="hello,world";char*dest=NULL;dest=(char*)malloc(sizeof(char)*(strlen(src)+1));intlen=strlen(src);char*d=dest;char*s=src+len-1;while(len--!=O)*d++=*s--;*d=*\0';printf("%s",dest);).簡(jiǎn)述ー個(gè)Linux驅(qū)動(dòng)程序的主要流程與功能。.請(qǐng)列舉ー個(gè)軟件中時(shí)間換空間或者空間換時(shí)間的例子。voidswap(inta,intb)(intc;c=a;a=b;b=a;)???>空優(yōu)voidswap(inta,intb)(a=a+b;b=a-b;a=a-b;)6.請(qǐng)問ート.程序?qū)⑤敵鍪裁唇Y(jié)果?char*RetMenory(void){charp[]="hellowworld";returnp;)voidTest(void)(char*str=NULL;str=RetMemory();printf(str);}RetMenory執(zhí)行完畢,p資源被回收,指向未知地址。返回地址,str的內(nèi)容應(yīng)是不可預(yù)測(cè)的,打印的應(yīng)該是str的地址

2、有一分?jǐn)?shù)序列:1/2,1/41/6,1/8一..,用函數(shù)調(diào)用的方法,求此數(shù)列前20項(xiàng)的和#include<stdio.h>doublegetValue(){doubleresult=0;inti=2;while(i<42).〇ハ;//^^^^^^^^^^^^^^^^^^^^^^i+=2;)returnresult;)intmain(){printf("resultis%f\n",getValue());system("pause");return0;}試題:voidtest2(){charstring[10],str1[10];inti;for(i=0;i<10;i++){str1[i]='a';)strcpyfstring,str1);',ハd3?折?普陽(yáng)效strcpyIf?:—?「

str1不能在數(shù)組內(nèi)結(jié)束:因?yàn)閟tr1的存儲(chǔ)為:{a,a,a,a,a,a,a,a,a,a},沒有へ0'(字符串結(jié)束符),所以不能結(jié)束strcpy(char*s1,char*s2)他的工作原理是,掃描s2指向的內(nèi)存,逐個(gè)字符付到s1所指向的內(nèi)存,直到碰到‘、?!?因?yàn)閟t“結(jié)尾沒有へ0',所以具有不確定性,不知道他后面還會(huì)付什么東東。正確應(yīng)如下voidtest2(){charstring[10],str1[10];inti;for(』〇;iv9;i++)(str1[i]='a'+i;〃把a(bǔ)bcdefghi賦值給字符數(shù)組)str[i]=,0';//加上結(jié)束符strcpy(string,str1);)第二個(gè)code題是實(shí)現(xiàn)strcmpintStrCmp(constchar*str1,constchar*str2)做是做對(duì)了,沒有抄搞,比較亂intStrCmp(constchar*str1,constchar*str2){assert(str1&&srt2);while(*str1&&*str2&&,str1==*str2){str1++,str2++;}if(*str1&&*str2)return(*str1-*str2);elseif(*str1&&*str2==0)return1;elseif(*str1==0&&*str2)return-1;elsereturn0;)intStrCmp(constchar*str1,constchar*str2)(〃省略判斷空指針(自己保證)while(*str1&&*str1++==*str2++);return*str1-*str2;}第三個(gè)code題是實(shí)現(xiàn)子串定位intAndSubStr(constchar*MainStr,constchar*SubStr)做是做對(duì)了,沒有抄搞,比較亂intMyStrstr(constchar*MainStr,constchar*SubStr)(constchar*p;constchar*q;constchar*u=MainStr;//assert((MainStr!=NULL)&&(SubStr!=NULL));〃用斷言對(duì)輸入進(jìn)行判斷white(*MainStr)〃內(nèi)部進(jìn)行遞增(p=MainStr;q=SubStr;while(*q&&*p&&*p++==*q++);if(ドq){returnMainStr-u+1;//MainStr指向當(dāng)前起始位,u指向)MainStr++;)return-1;)分析:intarr[]={6,7,8,9,10};int*ptr=arr;*(ptr++)+=123;printf(M%d%d",*ptr,?(++ptr));輸出:88過程:對(duì)于"(ptr++)+=123;先做加法6+123,然后++,指針指向7:對(duì)于printf("%d%d",*ptr,?(++ptr));從后往前執(zhí)行,指針先++,指向8,然后輸出8,緊接著再輸出8寫ー個(gè)函數(shù),功能:完成內(nèi)存之間的拷貝memcpysourcecode:270void*memcpy(void*dst,constvoid*src,unsignedintlen)271{272registerchar*d;273registerchar*s;27275if(len==0)276returndst;277278if(is_overlap(dst,src,lenflen))279complain3("memcpy",dst,src,len);280281if(dst>src){282d=(char*)dst+len-1;283s=(char*)src+len-1;284while(len>=4){285*d-=*s-;286*d—=*s--;287*d-=*s-;288*d—=*s-;289len-=4;290)291while(len--){292*d-=*s—;293}294}elseif(dst<src){295d=(char*)dst;296s=(char*)src;297while(len>=4){298*d++=*s++;299*d++=*s++;300*d++=*s++;301*d++=*s++;302len4;303}304while(len--){305*d++=*s++;306}307}308returndst;309}公司考試這種題目主要考你編寫的代碼是否考慮到各種情況,是否安全(不會(huì)溢出)各種情況包括:1、參數(shù)是指針,檢查指針是否有效2、檢查復(fù)制的源目標(biāo)和目的地是否為同一個(gè),若為同一個(gè),則直接跳出3,讀寫權(quán)限檢查4、安全檢查,是否會(huì)溢出memcpy拷貝ー塊內(nèi)存,內(nèi)存的大小你告訴它strcpy是字符串拷貝,遇到ヘ。‘結(jié)束/*memcpy 拷貝不重疊的內(nèi)存塊?/voidmemcpy(void*pvlb,void*pvFrom,size_tsize)(void*pbTo=(byte*)pvTo;void*pbFrom=(byte*)pvFrom;ASSERT(pvTb1=NULL&&pvFrom!=NULL);〃檢査輸入指針的有效性ASSERT(pbTo>=pbFrom+size11pbFrom>=pbTo+size);〃檢査兩個(gè)指針指向的內(nèi)存是否重疊while(size-->0)*pblb++==*pbFrom++;return(pvlb);)2。請(qǐng)編寫ー個(gè)C函數(shù),該函數(shù)在給定的內(nèi)存區(qū)域搜索給定的字符,并返冋該字符所在位置索引值。intsearch(char*cpSource,intn,charch)(inti;for(i=0;i<n&&*(cpSource+i)!=ch;++i);returni;)#include<stdio.h>voidfoo(intm,intn)(printf("m=%d,n=%d\n",m,n);)intmain(){intb=3;foo(b+=3,++b);printf("b=%d\nM,b);return0;)輸出:m=7,n=4,b=7(VC6.0)這種方式和編譯器中得函數(shù)調(diào)用關(guān)系相關(guān)即先后入棧順序。不過不同編譯器得處理不同。也是因?yàn)镃標(biāo)準(zhǔn)中對(duì)這種方式說(shuō)明為未定義,所以各個(gè)編譯器廠商都有自己得理解,所以最后產(chǎn)生得結(jié)果完全不同。因?yàn)檫@樣,所以遇見這種函數(shù),我們首先要考慮我們得編譯器會(huì)如何處理這樣得函數(shù),其次看函數(shù)得調(diào)用方式,不同得調(diào)用方式,可能產(chǎn)生不同得結(jié)果。最后是看編譯器優(yōu)化。3.編程實(shí)現(xiàn):把十進(jìn)制數(shù)(long型)分別以二進(jìn)制和十六進(jìn)制形式輸出,不能使用printf系列庫(kù)函數(shù)char*test3(longnum){char*buffer=(char*)malloc(11);buffer[O]=’0';buffer[1]='x';buffer[10]='\0';char*temp=buffer+2;for(inti=0;i<8;i++){temp[i]=(char)(num<<4*i>>28);temp[i]=temp[i]>=0?temp[i]:temp[i]+16;temp[i]=temp[i]<10?temp[i]+48:tempfi]+55;)returnbuffer;)輸入N,打印N*N矩陣比如N=3,打印:123894765N=4,打印:12341213145111615610987解答:#defineN15ints[N][N];voidmain(){intk=0,i=0,j=0;inta=1;for(;k<(N+1)/2;k++){while(j<N-k)s[i][j++]=a++;i++;j--;while(i<N-k)s[i++][j]=a++;i--;j--;while(j>k-1)s[i][j--]=a++;i-;j++;while(i>k)s[i--][j]=a++;i++;j++;)for(i=0;i<N;i++){for(j=0;j<N;j++)cout<<s[i][j]<<ヘギ;cout<<endl;))defineMAX_N100intmatrix[MAX_N][MAX_N];/**<x,y):第一個(gè)元素的坐標(biāo)?start:第一個(gè)元素的值?n:矩陣的大小*/voidSetMatrix(intx,inty,intstart,intn){inti,j;if(n<=〇)〃遞歸結(jié)束條件return;if(n==1){〃矩陣大小為1時(shí)matrix[x][y]=start;return;)for(i=x;i<x+n-1;i++)〃矩陣上部matrix[y][i]=starts+;for(j=y;j<y+n-1;j++)〃右部matrix[j][x+n-1]=start++;for(i=x+n-1;i>x;i--)〃底部matrix[y+n-1][i]=start++;for(j=y+n-1;j>y;j--)〃左部matrix[j][x]=start++;SetMatrix(x+1,y+1,start,n-2);〃遞歸)voidmain(){inti,j;intn;scanf("%d",&n);SetMatrix(O,0,1,n);〃打印螺旋矩陣for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%4d",matrix[i][j]);printf(R\nM);)Josephu問題為:設(shè)編號(hào)為1,2,…n的n個(gè)人圍坐ー圈,約定編號(hào)為k(1<=k<=n)的人從1開始報(bào)數(shù),數(shù)到m的那個(gè)人出列,它的下一位又從1開始報(bào)數(shù),數(shù)到m的那個(gè)人又出列,依次類推,直到所有人出列為止,由此產(chǎn)生一個(gè)出隊(duì)編號(hào)的序列。數(shù)組實(shí)現(xiàn):#include<stdio.h>#include<malloc.h>intJosephu(intn,intm){intflag,i,j=0;int*arr=(int*)malloc(n*sizeof(int));for(i=0;i<n;++i)arr[i]=1;for(i=1;i<n;++i)(flag=0;while(flag<m)(if(j==n)j=0;if(arr[j])++flag;)arr[j-1]=0;printf("第%4d個(gè)出局的人是:%4d號(hào)、n”,i,j);)free(arr);returnj;)intmain(){intn,m;scanf("%d%d",&n,&m);printf("最后勝利的是%d號(hào)!'n",Josephu(n,m));system("pause");return0;)鏈表實(shí)現(xiàn):include<stdio.h>include<malloc.h>typedefstructNode{intindex;structNode*next;}JosephuNode;intJosephu(intn,intm){inti,j;JosephuNode*head,,tail;head=tail=(JosephuNode*)malloc(sizeof(JosephuNode));for(i=1;i<n;++i){tail->index=i;tail->next=(JosephuNode*)malloc(sizeof(JosephuNode));tail=tail->next;)tail->index=i;tail->next=head;for(i=1;tail!=head;++i){for(j=1;j<m;++j)tail=head;head=head->next;)tail->next=head->next;printf("第%4d個(gè)出局的人是:%4d號(hào)、n”,i,head->index);free(head);head=tail->next;)i=head->index;free(head);returni;)intmain(){intn,m;scanf("%d%d",&n,&m);printf("最后勝利的是%d號(hào)!'n",Josephu(n,m));system("pause");return0;)已知strcpy函數(shù)的原型是:char*strcpy(char*strDest,constchar*strSrc);.不調(diào)用庫(kù)函數(shù).實(shí)現(xiàn)strcpy函數(shù)。.解釋為什么要返回char*.解說(shuō):1.strcpy的實(shí)現(xiàn)代碼char*strcpy(char*strDest,constchar*strSrc)(if((strDest==NULL)||(strSrc==NULL))file://[/1]throw"Invalidargument(s)°;//[2]char*strDestCopy=strDest;file://[/3]while(("strDest++=*strSrc++)!=‘'〇');file://[/4]returnstrDestCopy;}錯(cuò)誤的做法:[1](A)不檢査指針的有效性,說(shuō)明答題者不注重代碼的健壯性。(B)檢査指針的有效性時(shí)使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),說(shuō)明答題者對(duì)C語(yǔ)言中類型的隱式轉(zhuǎn)換沒有深刻認(rèn)識(shí)。在本例中char?轉(zhuǎn)換為bool即是類型隱式轉(zhuǎn)換,這種功能雖然靈活,但更多的是導(dǎo)致出錯(cuò)概率增大和維護(hù)成本升髙。所以C++專門增加了booktrue>false三個(gè)關(guān)鍵字以提供更安全的條件表達(dá)式。(C)檢査指針的有效性時(shí)使用((strDest==O)||(strSrc==O)),說(shuō)明答題者不知道使用常量的好處。直接使用字面常量(如本例中的〇)會(huì)減少程序的可維護(hù)性。〇雖然簡(jiǎn)單,但程序中可能出現(xiàn)很多處對(duì)指針的檢査,萬(wàn)一出現(xiàn)筆誤,編譯器不能發(fā)現(xiàn),生成的程序內(nèi)含邏輯錯(cuò)誤,很難排除。而使用NULL代替0,如果出現(xiàn)拼寫錯(cuò)誤,編譯器就會(huì)檢査出來(lái)。(A)returnnewstring("lnvalidargument(s)");?說(shuō)明答題者根本不知道返回值的用途,并且他對(duì)內(nèi)存泄漏也沒有警惕心。從函數(shù)中返冋函數(shù)體內(nèi)分配的內(nèi)存是十分危險(xiǎn)的做法,他把釋放內(nèi)存的義務(wù)拋給不知情的調(diào)用者,絕大多數(shù)情況下,調(diào)用者不會(huì)釋放內(nèi)存,這導(dǎo)致內(nèi)存泄漏。(B)return0;,說(shuō)明答題者沒有掌握異常機(jī)制。調(diào)用者有可能忘記檢査返回值,調(diào)用者還可能無(wú)法檢査返冋值(見后面的鏈?zhǔn)奖磉_(dá)式)。妄想讓返回值肩負(fù)返冋正確值和異常值的雙重功能,其結(jié)果往往是兩種功能都失效。應(yīng)該以拋出異常來(lái)代替返回值,這樣可以減輕調(diào)用者的負(fù)擔(dān)、使錯(cuò)誤不會(huì)被忽略、增強(qiáng)程序的可維護(hù)性。(A)忘記保存原始的strDest值,說(shuō)明答題者邏輯思維不嚴(yán)密。(A)循環(huán)寫成while(*strDest++?*strSrc++);?同(B)循環(huán)寫成while(*strSrc!=*\0')*strDest++=*strSrc++;,說(shuō)明答題者對(duì)邊界條件的檢査不カ。循環(huán)體結(jié)束后,strDest字符串的末尾沒有正確地加上へ。'〇預(yù)處理器(Preprocessor)1.用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表明1年中有多少秒(忽略閏年問題)★defineSECONDS_PER_YEAR(60*60*24*365)UL我在這想看到幾件事情:1).define語(yǔ)法的基本知識(shí)(例如:不能以分號(hào)結(jié)束,括號(hào)的使用,等等)2),懂得預(yù)處理器將為你計(jì)算常數(shù)表達(dá)式的值,因此,直接寫出你是如何計(jì)算一年中有多少秒而不是計(jì)算出實(shí)際的值,是更淸晰而沒有代價(jià)的。3),意識(shí)到這個(gè)表達(dá)式將使一個(gè)16位機(jī)的整型數(shù)溢出一因此要用到長(zhǎng)整型符號(hào)L,告訴編譯器這個(gè)常數(shù)是的長(zhǎng)整型數(shù)。4).如果你在你的表達(dá)式中用到UL(表示無(wú)符號(hào)長(zhǎng)整型),那么你有了一個(gè)好的起點(diǎn)。記住,第一印象很重要。寫一個(gè)“標(biāo)準(zhǔn)”宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。^defineM1N(A,B)((A)<=(B)(A):(B))這個(gè)測(cè)試是為下面的目的而設(shè)的:1),標(biāo)識(shí)#define在宏中應(yīng)用的基本知識(shí)。這是很重要的,因?yàn)橹钡角度?inline)操作符變?yōu)闃?biāo)準(zhǔn)C的ー部分,宏是方便產(chǎn)生嵌入代碼的唯一方法,對(duì)于嵌入式系統(tǒng)來(lái)說(shuō),為了能達(dá)到要求的性能,嵌入代碼經(jīng)常是必須的方法。2),三重條件操作符的知識(shí)。這個(gè)操作符存在C語(yǔ)言中的原因是它使得編譯器能產(chǎn)生比if-ihen-else更優(yōu)化的代碼,了解這個(gè)用法是很重要的。.懂得在宏中小心地把參數(shù)用括號(hào)括起來(lái).我也用這個(gè)問題開始討論宏的副作用,例如:當(dāng)你寫下面的代碼時(shí)會(huì)發(fā)生什么事?least=MIN(*p++,b);.預(yù)處理器標(biāo)識(shí)#e門?or的目的是什么?如果你不知道答案,請(qǐng)看參考文獻(xiàn)1。這問題對(duì)區(qū)分ー個(gè)正常的伙計(jì)和一個(gè)書呆子是很有用的。只有書呆子才會(huì)讀C語(yǔ)言課本的附錄去找出象這種問題的答案。當(dāng)然如果你不是在找?個(gè)書呆子,那么應(yīng)試者最好希望自己不要知道答案。死循環(huán)(Infiniteloops).嵌入式系統(tǒng)中經(jīng)常要用到無(wú)限循環(huán),你怎么樣用C編寫死循環(huán)呢?這個(gè)問題用幾個(gè)解決方案。我首選的方案是:while(l)(}ー些程序員更喜歡如下方案:for(;;)這個(gè)實(shí)現(xiàn)方式讓我為難,因?yàn)檫@個(gè)語(yǔ)法沒有確切表達(dá)到底怎么回事。如果ー個(gè)應(yīng)試者給出這個(gè)作為方案,我將用這個(gè)作為ー個(gè)機(jī)會(huì)去探究他們這樣做的基本原理。如果他們的基本答案是:“我被教著這樣做,但從沒有想到過為什么?!边@會(huì)給我留下ー個(gè)壞印象。第三個(gè)方案是用gotoLoop:gotoLoop;應(yīng)試者如給出上面的方案,這說(shuō)明或者他是ー個(gè)匯編語(yǔ)言程序員(這也許是好事)或者他是一個(gè)想進(jìn)入新領(lǐng)域的BAS1C/FORTRAN程序員。數(shù)據(jù)聲明(Datadeclarations).用變量a給出下面的定義ー個(gè)整型數(shù)(Aninteger)ー個(gè)指向整型數(shù)的指針(Apointertoaninteger)ー個(gè)指向指針的的指針,它指向的指針是指向ー個(gè)整型數(shù)(Apointertoapointertoaninteger)ー個(gè)有10個(gè)整型數(shù)的數(shù)組(Anarrayof10integers)?個(gè)有10個(gè)指針的數(shù)組,該指針是指向一?個(gè)整型數(shù)的(Anarrayof10pointerstointegers)ー個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(Apointertoanarrayof10integers)ー個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger)ー個(gè)有10個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger)答案是:inta;//Anintegerint*a;//Apointertoanintegerint**a;//Apointertoapointertoanintegerinta[10];//Anarrayof10integersint*a[10]://Anarrayof10pointerstointegersint(*a)[10];//Apointertoanarrayof10integersint(*a)(int);//Apointertoafunctionathattakesanintegerargumentandreturnsanintegerh)int(*a[10])(int);//Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturnaninteger人們經(jīng)常聲稱這里有幾個(gè)問題是那種要翻一下書才能回答的問題,我同意這種說(shuō)法.當(dāng)我寫這篇文章時(shí),為了確定語(yǔ)法的正確性,我的確査了?下書。但是當(dāng)我被面試的時(shí)候,我期望被問到這個(gè)問題(或者相近的問題)。因?yàn)樵诒幻嬖嚨倪@段時(shí)間里,我確定我知道這個(gè)問題的答案。應(yīng)試者如果不知道所有的答案(或至少大部分答案),那么也就沒有為這次面試做準(zhǔn)備,如果該面試者沒有為這次面試做準(zhǔn)備,那么他又能為什么出準(zhǔn)備呢?Static.關(guān)鍵字sialic的作用是什么?這個(gè)簡(jiǎn)單的問題很少有人能冋答完全。在C語(yǔ)言中,關(guān)鍵字static有三個(gè)明顯的作用:1),在函數(shù)體,ー個(gè)被聲明為靜態(tài)的變量在這ー函數(shù)被調(diào)用過程中維持其值不變。2),在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問.它是ー個(gè)本地的全局變量。3),在模塊內(nèi),ー個(gè)被聲明為靜態(tài)的函數(shù)只可被這ー模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。大多數(shù)應(yīng)試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是ー個(gè)應(yīng)試者的嚴(yán)重的缺點(diǎn),因?yàn)樗@然不懂得本地化數(shù)據(jù)和代碼范圍的好處和重要性。Const.關(guān)鍵字const是什么含意?我只要一聽到被面試者說(shuō):“const意味著常數(shù)”,我就知道我正在和一個(gè)業(yè)余者打交道。去年DanSaks已經(jīng)在他的文章里完全概括了const的所有用法,因此ESP(譯者:EmbeddedSystemsProgramming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么.如果你從沒有讀到那篇文章,只要能說(shuō)出const意味著“只讀”就可以了。盡管這個(gè)答案不是完全的答案,但我接受它作為ー個(gè)正確的答案。(如果你想知道更詳細(xì)的答案,仔細(xì)讀一下Saks的文章吧。)如果應(yīng)試者能正確回答這個(gè)問題,我將問他ー個(gè)附加的問題:下面的聲明都是什么意思?constinta;intconsta;constint*a;int*constaintconst*aconst;前兩個(gè)的作用是ー樣,a是ー個(gè)常整型數(shù).第三個(gè)意味著a是ー個(gè)指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個(gè)意思a是ー個(gè)指向整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后ー個(gè)意味著a是ー個(gè)指向常整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的)。如果應(yīng)試者能正確回答這些問題,那么他就給我留下了一個(gè)好印象。順帶提一句,也許你可能會(huì)問,即使不用關(guān)鍵字const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const呢?我也如下的幾下理由:1),關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個(gè)參數(shù)為常量是為了告訴了用戶這個(gè)參數(shù)的應(yīng)用目的。如果你曾花很多時(shí)間清理其它人留下的垃圾,你就會(huì)很快學(xué)會(huì)感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用consl的程序員很少會(huì)留下的垃圾讓別人來(lái)清理的。)2),通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。3),合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無(wú)意的代碼修改。簡(jiǎn)而言之,這樣可以減少bug的出現(xiàn)。Volatile.關(guān)鍵字volatile有什么含意并給出三個(gè)不同的例子。ー個(gè)定義為volatile的變量是說(shuō)這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。精確地說(shuō)就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。下而是volatile變量的幾個(gè)例子:1),并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)2),ー個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automaticvariables)3),多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量?jī)沾鸩怀鲞@個(gè)問題的人是不會(huì)被雇傭的。我認(rèn)為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile內(nèi)容將會(huì)帶來(lái)災(zāi)難。假設(shè)被面試者正確地回答了這是問題(嗯,懷疑這否會(huì)是這樣),我將梢微深究ー下,看一下這家伙是不是直正懂得volatile完全的重要性。1),ー個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么。2),ー個(gè)指針可以是volatile嗎?解釋為什么.3),下面的函數(shù)冇什么錯(cuò)誤:intsquare(volatileint*ptr)return*ptr**ptr:下面是答案:1),是的。ー個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖?。它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它。2),是的。盡管這并不很常見。?個(gè)例子是當(dāng)ー個(gè)中服務(wù)子程序修該ー個(gè)指向ー個(gè)buffer的指針時(shí)。3).這段代碼的有個(gè)惡作劇。這段代碼的目的是用來(lái)返指針?plr指向值的平方,但是,由于*pir指向ー個(gè)volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:intsquare(volatileint*ptr)(inta,b;a=*ptr;b=*ptr;returna*b;}由于?ptr的值可能被意想不到地該變,因此a和b可能是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:longsquare(volatileint*ptr)(inta;a=*ptr;returna*a;}位操作(Bitmanipulation)9.嵌入式系統(tǒng)總是要用戶對(duì)變量或寄存器進(jìn)行位操作。給定一個(gè)整型變量a,寫兩段代碼,第一個(gè)設(shè)置a的bil3,第二個(gè)淸除a的bil3。在以上兩個(gè)操作中,要保持其它位不變。對(duì)這個(gè)問題有三種基本的反應(yīng)1)?不知道如何下手。該被而者從沒做過任何嵌入式系統(tǒng)的工作。2),用bitfields。Bitfields是被扔到C語(yǔ)言死角的東西,它保證你的代碼在不同編譯器之間是不可移植的,同時(shí)也保證了的你的代碼是不可重用的。我最近不幸看到Infineon為其較復(fù)雜的通信芯片寫的驅(qū)動(dòng)程序,它用到了bitfields因此完全對(duì)我無(wú)用,因?yàn)槲业木幾g器用其它的方式來(lái)實(shí)現(xiàn)bitfields的。從道德講:永遠(yuǎn)不要讓ー個(gè)非嵌入式的家伙粘實(shí)際硬件的邊。3).用?defines和bitmasks操作。這是ー個(gè)有極髙可移植性的方法,是應(yīng)該被用到的方法。最佳的解決方案如下:〈defineBIT3(0xl?3)staticinta;voidset_bit3(void)(a|=BIT3;}voidclearbit3(void)&=?BIT3;}ー些人喜歡為設(shè)置和

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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)論