2024年C語言軟件工程師筆試題大全_第1頁
2024年C語言軟件工程師筆試題大全_第2頁
2024年C語言軟件工程師筆試題大全_第3頁
2024年C語言軟件工程師筆試題大全_第4頁
2024年C語言軟件工程師筆試題大全_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

網(wǎng)絡(luò)安全應(yīng)具有如下五他方面的特性:

保密性:信息不泄露非授權(quán)顧客、實(shí)體或遇程,或供其運(yùn)用的特性。

完整性:數(shù)據(jù)未女監(jiān)授權(quán)不能暹行變化的特性。即信息在存儲(chǔ)或傳播謾程中保持不被修改、不被破壤和丟失

的特性。

可用性:可被授權(quán)實(shí)體訪冏并按需求使用的特性。即常需要畤能否存取所需

的信息0例如網(wǎng)絡(luò)環(huán)境下拒絕服務(wù)、破壤網(wǎng)絡(luò)和有關(guān)系統(tǒng)的正常運(yùn)行等都屬于封可用性的襲擊;

可控性:封信息的傳播及內(nèi)容具有控制能力。

可審查性:出現(xiàn)安全提供根據(jù)與手段第壹部分:基本概念及其他冏答題

1、關(guān)鍵字static的作用是什么?

it他簡樸的冏題很少有人能回答完全。在言中,關(guān)鍵字static有三他明顯的作用:

1).在函數(shù)體,克種被申明卷靜態(tài)的變量在道克函數(shù)被調(diào)用遇程中維持其值不變。

2).在模塊內(nèi)(但在函數(shù)體外),壹種被申明卷靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪冏,但不能被模塊外其他函數(shù)

訪冏。它是壹種常地的全局變量。

3).在模塊內(nèi),壹種被申明卷靜態(tài)的函數(shù)只可被適壹模塊內(nèi)的其他函數(shù)調(diào)用。那就是,道他I函數(shù)被限制在申明它的

模塊的常地范圍內(nèi)使用.(富地化數(shù)據(jù)和代碼范圍的好處和重要性)。

2、“引用”與指針的區(qū)別是什么?

答、1)引用必須被初始化,指針不必。

2)引用初始化彳爰來不能被變化,指針可以變化所指的封象。

3)不存在指向空值的引用,不謾存在指向空值的指針。

指針通遇某他指針變量指向宜種封象彳爰,封它所指向的變量間接操作。程序中使用指針,程序的可^性差;而引用

自身就是目的變量的別名,封引用的操作就是封目的變量的操作。

流操作符<<和>、賦值操作符=的返可值、拷貝構(gòu)造函數(shù)的參數(shù)、賦值操作符=的參數(shù)、其他狀況都推薦使用引用。

3、.h文獻(xiàn)中的ifndef/define/endif的作用?

答:防止該^文獻(xiàn)被反復(fù)引用。

4、^include與^include"file,h”的區(qū)別?

答:前者是優(yōu)StandardLibrap的途徑尋找和引用file.h,而彳灸者是徙目前工作途徑搜尋并引用file.h。

5、描述實(shí)疇系統(tǒng)的基本特性

答:在特定期間內(nèi)完畢特定的任務(wù),實(shí)畤性與可靠性。

6、全局變量和局部變量在內(nèi)存中與否有區(qū)別?假如有,是什么區(qū)別?

答:全局變量儲(chǔ)存在靜態(tài)數(shù)據(jù)區(qū),局部變量在堆棧中。

7、什么是平衡二叉樹?

答:左右子樹都是平衡二叉樹且左右子樹的深度差值的絕封值不不小于1。

8、堆棧溢出壹般是由什么原因?qū)е碌模?/p>

答:1.沒有回收垃圾資源2.層次太深的遞歸調(diào)用

9、冒泡排序算法的畤間復(fù)雜度是什么?答:0(Z2)

10、什么函數(shù)不能申明卷虛函數(shù)?答:constructor

11、隊(duì)列和棧有什么區(qū)別?答:隊(duì)列先迤先出,棧彳夏暹先出

12、不能做switch。的參數(shù)類型答:switch的參數(shù)不能卷實(shí)型。

13、局部變量能否和全局變量重名?答:能,局部曾屏蔽全局。要用全局變量,需要使用“::”

局部變量可以與全局變最同名,在函數(shù)內(nèi)引用it他變量畤,畬用到同名的局部變量,而不御用到全局變量。封于有

些編譯器而言,在同壹種函數(shù)內(nèi)可以定義多種同名的局部變量,例如在兩循環(huán)體內(nèi)都定義壹種同名的局部變量,

而那佃局部變量的作用域就在那他I循環(huán)體內(nèi)

14、怎樣引用壹種已^定義謾的全局變量?

答、可以用引用^文獻(xiàn)的方式,也可以用extern關(guān)鍵字,假如用引用^文獻(xiàn)方式來引用某低I在^文獻(xiàn)中申明的全

局變量,假定你將那倜變量寫籍了,那么在編譯期間畬報(bào)金昔,假如你用extorn方式引用畤,假定你犯了同樣的^

誤,那么在編譯期間不曾報(bào)金背,而在連接期間報(bào)金普。

15、全局變量可不可以定義在可被多種.C文獻(xiàn)包括的^文獻(xiàn)中?卷何?

答、可以,在不壹樣的C文獻(xiàn)中以static形式來申明同名全局變量。

可以在不壹樣的C文獻(xiàn)中申明同名的全局變量,前提是其中只能有壹種C文獻(xiàn)中封此變最賦初值,此畤連接不畬出

金昔。

16,^句for(;1:)有什么冏題?它是什么意思?答、和while(l)相似,維限循環(huán)。

17、do……while和while……do有什么區(qū)別?答、前壹種循環(huán)壹遍再判斷,彳愛壹種判斷彳爰來再循環(huán)。

18、statac全局變量、局部變量、函數(shù)與壹般全局變量、局部變量、函數(shù)

答、全局變量(外部變量)的闡明之前再冠以static就構(gòu)成了靜態(tài)的全局變量。全局變量自身就是靜態(tài)存儲(chǔ)方式,

靜態(tài)全局變量常然也是靜態(tài)存儲(chǔ)方式。適兩者在存儲(chǔ)方式上并輾不壹樣。追兩者的區(qū)別雖在于豐靜態(tài)全局變量的

作用域是整他源程序,富壹種源程序由多種源文獻(xiàn)構(gòu)成畤,非靜態(tài)的全局變量在各他I源文獻(xiàn)中都是有效的。而靜

態(tài)全局變量則限制了其作用域,即只在定義該變量的源文獻(xiàn)內(nèi)有效,在同壹源程序的其他源文獻(xiàn)中不能使用它。

由于靜態(tài)全局變量的作用域局限于壹種源文獻(xiàn)內(nèi),只能懸該源文解:內(nèi)的函數(shù)公用,因此可以防止在其他源文獻(xiàn)中

引起籍誤。優(yōu)以上分析可以看出,把局部變量變化懸靜態(tài)變量彳灸足變化了它的存儲(chǔ)方式即變化了它的生存期。把

全局變量變化卷靜態(tài)變量彳發(fā)是變化了它的作用域,限制了它的使用范圍。

static函數(shù)與壹般函數(shù)作用域不壹樣。僅在本文獻(xiàn)。只在目前源文獻(xiàn)中使用的函數(shù)應(yīng)常闡明卷內(nèi)部函數(shù)(static),

內(nèi)部函數(shù)應(yīng)常在目前源文獻(xiàn)中闡明和定義。封于可在目前源文獻(xiàn)以外使用的函數(shù),應(yīng)常在壹種^文獻(xiàn)中闡明,要使

用道些函數(shù)的源文獻(xiàn)要包括適假文獻(xiàn)

static全局變量與壹般的全局變量有什么區(qū)別:static全局變量只初使化壹次,防止在其他文獻(xiàn)軍元中被引用;

static局部變量和壹般局部變量有什么區(qū)別:static局部變量只被初始化壹次,下壹次根據(jù)上壹次成果值:

static函數(shù)與壹般函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有壹,分,壹般函數(shù)在每倜被調(diào)用中維持壹份拷貝

19、程序的內(nèi)存分派

答:壹種由"C++編譯的程序占用的內(nèi)存分卷如下幾種部分

1、棧區(qū)(slack)一由編譯^自勤分派釋放,寄存函數(shù)的參數(shù)值,局部變量的值等。具操作方式類似于數(shù)據(jù)構(gòu)造中

的棧。

2、堆區(qū)(heap)一壹股由程序員分派釋放,若程序員不釋放,程序^束畤也聲午由OS回收。注意它與數(shù)據(jù)構(gòu)造中的

堆是兩回事,分派方式倒是類似于鏈表,呵呵。

3、全局區(qū)(靜態(tài)區(qū))(static)一全局變量和靜態(tài)變量的存儲(chǔ)是放在壹塊的,初始化的全局變量和靜態(tài)變量在壹

塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另壹塊區(qū)域。程序結(jié)束彳灸由系統(tǒng)釋放。

4、文字常量區(qū)一常量字符串就是放在造裹的。程序幺吉束彳爰由系統(tǒng)釋放。

5、程序代碼區(qū)一寄存函數(shù)體的二迤制代碼

例子程序

道是壹種前輩寫的,非常詳細(xì)

//main,cpp

inta=0;〃全局初始化區(qū)

char*pl;〃全局未初始化區(qū)

mainO

(

intb;棧

chars[]=Mabc”;〃棧

char*p2;//棧

char*p3="123456";//123456\0在常量區(qū),p3在棧上。

stciticintc=0;//全局(靜態(tài))初始化區(qū)

pl=(char*)maHoc(10);

p2=(char*)malloc(20);〃分派得來得10和20字節(jié)的區(qū)域就在堆區(qū)。

strcpy(pl,”123456");〃123456\0放在常量區(qū),編譯器也^喻將它與p3所向”123456〃優(yōu)化成壹種地方。

)

20、解釋堆和棧的區(qū)別

答:堆(heap)和棧(stack)的區(qū)別

(1)申^方式

stack:由系統(tǒng)自勤分派。例如I,申明在函數(shù)中壹種局部變量intb;系統(tǒng)自勵(lì)在棧中卷辟空間

heap:需要程序員自己申Bt,并指明大小,在c中malloc函數(shù)如pl=(char指malloc(10);

在C+■中用new運(yùn)算符,如p2=(char*)malloc(10);不遇注意pl、p2自身是在棧中的。

(2)中^彳爰系統(tǒng)的響應(yīng)

棧:只要棧的剩余空間不小于所申^空間,系統(tǒng)將卷程序提供內(nèi)存,否則將報(bào)異常提醒棧溢山。

堆:首先應(yīng)常懂得操作系統(tǒng)有壹種記錄空閑內(nèi)存地址的鏈表,富系統(tǒng)收到程序的申言青口寺,曾遍歷該鏈表,尋找第壹

種空間不小于所申^空間的堆結(jié)黠,然彳發(fā)將該。吉鉆優(yōu)空閑結(jié)粘鏈表中刪除,并將該結(jié)鉆的空間分派給程序,此外,

封于大多數(shù)系統(tǒng),畬在造塊內(nèi)存空間中的首地址處記錄本次分派的大小,造樣,代碼中的deleted句才能封的的

釋放本內(nèi)存空間。此外,由于找到的堆黠的大小不壹定恰好等于申^的大小,系統(tǒng)畬自勤的將多出的那部分重新

放入空閑鏈表中。

(3)申3大小的限制

棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)構(gòu)造,是壹塊持續(xù)的內(nèi)存的區(qū)域。道句話的意思是棧頂?shù)牡刂泛蜅5?/p>

最大容量是系統(tǒng)預(yù)先規(guī)定好的,在WINDOWS下,棧的大小是2M(也有的^是1M,,纏'之是壹種編譯詩就確定的常數(shù)),

假如中^的空間超謾棧的剩余空間畤,將提醒3“n°w。因此,能優(yōu)棧獲得的空間較小。

堆:堆是向高地址擴(kuò)展的數(shù)據(jù)構(gòu)造,是不持續(xù)的內(nèi)存區(qū)域。it是由于系統(tǒng)是用鏈表來存儲(chǔ)的空閑內(nèi)存地址的,自然

是不持續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見,

堆獲得的空間比較靈活,也比較大。

(4)申^效率的比較:

棧:由系統(tǒng)自勤分派,速度較快。但程序員是輾法控制的。

堆:是由new分派的內(nèi)存,壹般速度比較慢,并且輕易產(chǎn)生內(nèi)存碎片,不謾用起來最以便.

此外,在WINDOWS下,最佳的方式是用VirtualAlloc分派內(nèi)存,他不是在堆,也不是在棧,而是直.接在暹程的地

址空間中保留壹塊內(nèi)存,雖然用起來最不以便。不遇速度快,也最靈活。

(5)堆和棧中的存儲(chǔ)內(nèi)容

棧:在函數(shù)調(diào)用畤,第壹種暹棧的是主函數(shù)中彳發(fā)的下壹條指令(函數(shù)調(diào)用言吾句的下壹條可執(zhí)行者吾句)的地址,然彳奏

是函數(shù)的各信I參數(shù),在大多數(shù)的C編譯器中,參數(shù)是由右往左入棧的,然彳爰是函數(shù)中的局部變量。注意靜態(tài)變量是

不入棧的。

常本次函數(shù)調(diào)用^束彳爰,局部變量先出棧,然彳爰是參數(shù),最終棧頂指針指向最始存的地址,也就是主函數(shù)中的下

壹條指令,程序由該粘繼續(xù)運(yùn)行。

堆:壹般是在堆的^部用壹種字節(jié)寄存堆的大小。堆中的詳細(xì)內(nèi)容由程序員安排。

(6)存取效率的比較

charsi口="aaaaaaaaaaaaaaa";aaaaaaaaaaa是在運(yùn)行畤亥ij賦值的;

char*s2=nbbbbbbbbbbbbbbbbb,,;而bbbbbbbbbbb是在編譯疇就確定的;

不謾,在彳奏來的存取中,在枝.卜?的數(shù)組比指針?biāo)赶虻淖址ɡ缍眩┛臁?/p>

例如:

#include

voidmainO

chara=l;

charc□二”〃;

char*p二"";

a=c[l];

a=p[l];

return;

封應(yīng)的匯編代碼

10:a=c[l];

A4DFlmovcl,byteptr[ebp-OFh]

0040106A884DFCmovbyteptr[ebp-4].cl

ll:a=p[l];

0040106D8B55ECmovcdx,dwordptr[obp-14h]

A4201moval,byteptr[edx+1]

FCmovbytcptr[cbp-4],al

24、三種基本的數(shù)據(jù)模型

答:按照數(shù)據(jù)構(gòu)造類型的不宜樣,將數(shù)據(jù)模型劃分四層次模型、網(wǎng)狀模型和關(guān)系模型。

25、構(gòu)造與聯(lián)合有和區(qū)別?

答:(1).構(gòu)造和聯(lián)合都是由多種不壹樣的數(shù)據(jù)類型組員構(gòu)成,但在任何同壹畤刻,聯(lián)合中只寄存了壹種被選中的

組員(所有組員共用壹塊地址空間),而構(gòu)造的所有組員都存在(不壹樣組員的寄存地址不壹樣)。

(2)封于聯(lián)合的不壹樣組員賦值,將曾封其他組員重寫,本來組員的值就不存在了,而封于構(gòu)造的不壹樣組員賦值

是互不影響的

26、描述內(nèi)存分派方式以及它儼]的區(qū)別?

答:1)優(yōu)靜態(tài)存儲(chǔ)區(qū)域分派。內(nèi)存在程序編譯的畤候就一蟀分派好,造塊內(nèi)存在程序的整他運(yùn)行期間都存在。例

如全局變量,static變量。

2)在棧上創(chuàng)立。在執(zhí)行函數(shù)畤,函數(shù)內(nèi)局部變量的存儲(chǔ)罩元都可以在棧上創(chuàng)立,函數(shù)執(zhí)行結(jié)束畤造些存儲(chǔ)罩元自

勤被釋放。棧內(nèi)存分派運(yùn)算內(nèi)置丁攵理器的指令集。

3)優(yōu)堆上分派,亦稱勁態(tài)內(nèi)存分派。程序在運(yùn)行的畤候用malls或new申^任意多少的內(nèi)存,程序員自己負(fù)賁

在何疇用free或delete釋放內(nèi)存,勤態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活,但冏題也最多

27、鵲^出const與#€^門聯(lián)相比,有何是處?

答:Const作用:定義常量、修飾函數(shù)參數(shù)、修飾函數(shù)返回值三倜作用。被Const修飾的束西都受到強(qiáng)制保護(hù),可

以防匚意外的變勤,能提高程序的強(qiáng)健性。

1)const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以封前者迤行類型安全檢查。而封彳灸者只暹行字符

替代,沒有類型安全檢查,并且在字符替代也^^產(chǎn)生意料不到的當(dāng)昔誤。

2)有些集成化的調(diào)試工具可以封const常量暹行調(diào)試,不謾不能封宏常最暹行調(diào)試。

28、藺述數(shù)組與指針的區(qū)別?

答:數(shù)組要么在靜態(tài)存儲(chǔ)區(qū)被創(chuàng)立]如全局?jǐn)?shù)組),要么在棧上被創(chuàng)立。指針可以隨畤指向任意類型的內(nèi)存塊。

(1)修改內(nèi)容上的差異

chara[]="hello”;

a[0]='X,;

cheir*p="world”;〃注意p指向常量字符串

p[0]='X';〃編譯器不能發(fā)現(xiàn)該金昔誤,運(yùn)行畤^誤

(2)月運(yùn)算符sizeof可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))。sizeof(p),p卷指針得到的是壹種指針變量的字節(jié)數(shù),

而不是P所指的內(nèi)存容量。C++/C^言沒有措施懂得指針?biāo)傅膬?nèi)存容量,除非在申言青內(nèi)存畤記住它。注意富數(shù)組

作卷函數(shù)的參數(shù)選行傳遞暗,該數(shù)組自勤退化卷同類型的指針。

chara[]="helloworldn;

char*p=a;

cout?sizeof(a)<<endl;//12字節(jié)

cout?sizeof(p)<<cndl;//4字節(jié)

計(jì)算數(shù)組和指針的內(nèi)存容量

voidFunc(chara[100])

(

cout?sizeof(a)<<endl;//4字節(jié)而不是100字節(jié)

)

29、分別寫出BOOL,int,float,指針類型的變量a與“零”的比較^句。

答:BOOL:if(!a)orif(a)

int:if(a==0)

float:constEXPRESSIONEXP=0.000001

if(a<EXP&&a>-EXP)

pointer:if(a!=NULL)orif(a==NULL)

30、怎樣判斷壹段程序是由C編譯程序遢是由C++編譯程序編譯的?

答:#ifdef_cplusplus

cout?"c++”;

ttelse

coutVc”;

ftendif

31、論述含參數(shù)的宏與函數(shù)的優(yōu)缺陷

答:帶參宏函數(shù)

處理疇間編譯畤程序運(yùn)行畤

參數(shù)類型沒有參數(shù)類型冏題定義實(shí)參、形參類型

處理謾程不分派內(nèi)存分派內(nèi)存

程序晨度變晨不變

運(yùn)行速度不占運(yùn)行疇間調(diào)用利返回占用畤間

32、月兩彳固棧實(shí)現(xiàn)壹種隊(duì)列的功能?規(guī)定^出算法和思緒!

答:設(shè)棧卷A,B,壹^始均^空.

入隊(duì);將新元素push入棧A.

出隊(duì):(1)判斷棧B與否卷空;(2)假如不卷空,則將棧A中所有元素依次pop出并push到棧B;

(3)將棧B的棧頂元素pop出;

道樣實(shí)現(xiàn)的隊(duì)列入隊(duì)和出隊(duì)的平攤復(fù)雜度都11是0(1),比上面的幾種措施要好

33、嵌入式系統(tǒng)中常常要用到焦限循環(huán),你怎么樣用C編寫死循環(huán)呢?

答:適值1冏題用幾種處理方案。我首選的方案是:

whilc(l)

(

}

某些程序員更喜歡如下方案:

for(;;)

(

)

第一:佃方案是用goto

Loop:

gotoLoop;

應(yīng)試者如給出上面的方案,道闡明或者他是壹種匯編^言程序員(iM也言午是好事)或者他是壹種想迤入新領(lǐng)域的

BASIC/FORTRAN程序員。

34、位操作(Bitmanipulation)

答:嵌入式系統(tǒng)纏.是要顧客封變量或寄存器誕行位操作。給定壹種整型變量a,寫兩段代碼,第壹種設(shè)置.a的bit

3,第二他清除a的bit3o在以上兩值]操作中,要保持其他位不變。

封道佃冏題有三種基本的反應(yīng)

D不懂得怎樣下手。該被面者優(yōu)沒做遇任何嵌入式系統(tǒng)的工作。

2)用bitfieldsoBitfields是被扔到C言吾言死角的柬西,它保證你的代碼在不壹樣編譯器之間是不可移植的,

同步也保證了的你的代碼是不可重用的。我近來不幸看到Infineon卷其較復(fù)雜的通信芯片寫的驅(qū)勤程序,它用到

了bitfields因此完全封我輾用,力于我的編譯器用其他的方式來實(shí)垣bitfields的。優(yōu)道德講:永速不要讓壹

種非嵌入式的家伙粘實(shí)際硬件的邊。

3)用defines和bitmasks操作。造是壹種有極高可移植性的措施,是應(yīng)常被用到的措施。最佳的處理方案如

下:

8defineBIT3(0x1?3)

staticinta;

voidset_bit3(void)

(

a|=BIT3;

)

voidclearbit3(void)

(

a&=~BIT3;

}

某些人喜歡卷設(shè)置和清除值而定義登種掩碼同步定義某些闡明常數(shù),造也是可以接受的。我但愿看到幾種要黠:闡

明常數(shù)、I二和&二~操作。

35、訪冏固定的內(nèi)存位置(Accessingfixedmemorylocations)

答:嵌入式系統(tǒng)常常具有規(guī)定程序員去訪冏某特定的內(nèi)存位置的特鉆。在某工程中,規(guī)定設(shè)置壹絕封地址卷0x67a9

的整型變量的值卷0xaa66。編譯器是壹種純粹的ANSI編譯器。寫代碼去完畢;?壹任務(wù)。

道壹冏題測試你與否懂得卷了訪冏壹絕封地址把壹種整型數(shù)強(qiáng)制轉(zhuǎn)換(typecast)卷壹指針是合法的。道壹冏題的

實(shí)現(xiàn)方式伴隨他I人閩格不壹樣而不壹樣。幺里典的類似代碼如下:

int*ptr;

ptr=(int*)0x67a9:

*ptr=0xaa66;

Amoieobscureappiuciuliis:

壹種較晦澀的措施是:

*(int*const)(0x67a9)=0xaa55;

雖然你的品味更靠近第二種方案,但我提議你在面試畤使用第壹種方案。

36、中斷(Interrupts)

答:中斷是嵌入式系統(tǒng)中重要的構(gòu)成部分,道導(dǎo)致了諸多編譯^發(fā)商提供壹種擴(kuò)展一讓原則C支持中斷。具代表

事實(shí)是,產(chǎn)生了壹種新的關(guān)鍵字—interrupt。下面的代碼就使用了—interrupt關(guān)鍵字去定義了壹種中斷服務(wù)子

程序(ISR),^評論壹下道段代碼的,

interruptdoublecomputearea(doubleradius)

(

doublearea=PI*radius*radius;

printfC"\nArea=%f”,area);

returnarea;

)

道f0函數(shù)有太多的金昔誤了,以至讓人不知攏何^起了:

DISR不能返回壹種值。假如你不懂il他,那么你不曾被雇用的。

2)1SR不能傳遞參數(shù)。假如你沒有看到道壹鉆,你被雇用的機(jī)畬等同笫壹項(xiàng)。

3)在^多的處理器/編譯器中,浮玷壹般都是不可重入的。有些處理器/編譯器需要讓額處的寄存器入棧,有些處

理器/編譯器就是不容^在ISR中做浮黠運(yùn)算。此外,【SR應(yīng)常是短而有效率的,在ISR中做浮黠運(yùn)算是不明智的.

4)與第三黠壹脈相承,printfO常常有重入和性能上的冏題。假如你丟掉了第三和第四黠,我不曾太卷難你的。

不用假如你能得到彳為兩黠,那么你的被雇用前景越來越光明了。

37、勤態(tài)內(nèi)存分派(Dynamicmemory<illocation)

答:盡管不像非嵌入式計(jì)算機(jī)那么常見,嵌入式系統(tǒng)遢是有優(yōu)堆(heap)中勵(lì)態(tài)分派內(nèi)存的遇程的。那么嵌入式系

統(tǒng)中,勤態(tài)分派內(nèi)存也^發(fā)生的冏題是什么?

道裹,我期望應(yīng)試者能提到內(nèi)存碎片,碎片搜集的冏題,變量的持行畤聞等等。道他主題已^在ESP雜志中被廣泛

地討論謾了(重要是P.J.Plauger,他的解釋逮逮超謾我道裹能提到的任何解釋),所有同謾^看壹下道些雜志

吧!讓應(yīng)試者暹入壹種虛假的安全感竟彳為,我拿出道樣壹種小節(jié)目:

下面的代碼片段的輸出是什么,卷何?

char*ptr;

if((ptr=(char*)malloc(0))==NULL)

putsCGotanullpointer");

else

putsCGotavalidpointer");

道是壹種有趣的冏題。近來在我的壹種同事不^意把。值傳幺合了函數(shù)malloc,得到了壹種合法的指針之彳奏,我才想

到造佃冏題。造就是上面的代碼,該代碼的輸出是“Gotavalidpointer"。我用道倜來^始討論造樣的壹冏題,

看看被面試者與否想到庫例程造樣做是封的。得到封的的答案富然重要,但處理冏題的措施和你做決定的基本原理

更重要些。

38、Typedef

答:Typedef在言中頻繁用以申明壹種己^存在的數(shù)據(jù)類型的同義字。也可以用預(yù)處理器做類似的事。例如,

思索壹下下面的例子:

ttdefinedPSstructs*

typedefstructs*tPS;

以上兩種狀況的意圖都是要定義dPS和tPS作卷壹種指向構(gòu)造s指針。哪種措施更好呢?(假如有的話)得可?

道是壹種非常微妙的冏題,任何人答封道他冏題(合法的原因)是應(yīng)常被恭喜的。答案是:lypedef更好。思索下

面的例子:

dPSpl,p2;

tPSp3,p4;

第壹種擴(kuò)展卷

structs*pl,p2;

上面的代碼定義pl卷壹種指向構(gòu)造的指,p2卷壹種實(shí)際的構(gòu)造,it也言午不是你想要的。第二倜洌子封的地定義了

p3和p4兩指針?

39、月變最a名金出下面的定義

答:a)壹種整型數(shù)(Aninteger)

b)壹種指向整型數(shù)的指針(Apointertoaninteger)

c)壹種指向指針的的指針,它指向的指針是指向壹種整型數(shù)(Apointertoapointertoaninteger)

d)壹種有10佰I整型數(shù)的數(shù)組(Anarrayof10integers)

e)壹種有10flS|指針的數(shù)組,該指臺(tái)是指向壹種整型數(shù)的(Anarrayof10pointerstointegers)

f)壹種指向有10f0整型數(shù)數(shù)組的指針(Apointertoanarrayof10integers)

g)壹種指向函數(shù)的指針,該函數(shù)有壹種整型參數(shù)并返回壹種整型數(shù)(Apointertoafunctionthattakesan

integerasanargumentandreturnsaninteger)

h)壹種有10他指針的數(shù)組,該指針指向壹種函數(shù),該函數(shù)有壹種整型參數(shù)并返回壹種整型數(shù)(Anarrayoften

pointerstofunctionsthattakeaninteger

argumentandreturnaninteger)

答案是:

a)inta;//Aninteger

b)int*a;//Apointertoaninteger

c)int**a;//Apointertoapointertoaninteger

d)inta[10];//Anarrayof10integers

e)int*a[10];//Anarrayof10pointerstointegers

f)int(*a)[10];//Apointertoanarrayof10integers

g)int(*a)(int);//Apointerzoafunctionathattakesanintegerargumentandreturnsaninteger

h)int(*a[10])(int);//Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturn

aninteger

40、解釋局部變量、全局變量和靜態(tài)變量的含義。

答:

41、寫壹種“原則”宏

答:互換兩彳固參數(shù)值的宏定義卷:.(defineSWAP(a,b)\

(a)=(a)+(b);\

(b)=(a)-(b);\

(a)=(a)-(b);

輸入兩低1參數(shù),輸出較小的壹種:defineMIN(A,B)((A)<(B))?(A):(B))

表明1年中有多少秒(忽視閏年冏H):#defineSECONDS_PER_YEAR(60*60*24*365)UL

^defineDOUBLE(x)x+x與^defineDOUBLE(x)((x)+(x))

i=5*D0UBLE(5);i30i=5*D0UBLE(5);i50

已知登種數(shù)組table,用壹種宏定義,求出數(shù)據(jù)的元素彳周數(shù)

^defineNTBL

ttdefineNTBL(sizcof(table)/sizeof(table[0]))

42、A.c和B.c兩他c文獻(xiàn)中使用了兩他相似名字的static變量,編譯的疇候曾不曾有冏題?適兩值Istatic變量曾

保留到哪裹(棧遢是堆或者其他的)?

答:static的全局變最,表明51倜變量僅在本模塊中故意義,不畬影響其他模塊。

他都放在數(shù)據(jù)區(qū),不謾編譯器封他45的命名是不壹樣的。

假如要使變量在其他模塊也故意義的話,需要使用extern關(guān)鍵字,

43、壹種用.向鏈表,不懂得^節(jié)黠,壹種指針指向其中的壹種節(jié)黠,冏怎樣刪除迨倜指針指向的節(jié)黠?

答:將造他1指針指向的next節(jié)黠值copy到本節(jié)鉆,將next指向next->next,并隨即刪除原next指向的節(jié)黠。

第二部分:程序代碼評價(jià)或者找金昔

1、下面的代碼輸出是什么,懸何?

voidfoo(void)

unsignedinta=6;

intb=-20;

(u+b>6)?puts(M>6"):puls(a<=6〃);

}

追他冏題測試你與否懂得言中的整數(shù)自勤轉(zhuǎn)換原則,我發(fā)既有些^發(fā)者懂得很少追些柬西。不管怎樣,適輾符

號(hào)整型冏題的答案是輸出是“>6〃。原因是富體現(xiàn)式中存在有符號(hào)類型和輾符號(hào)類型畤所有的操作數(shù)都自勤轉(zhuǎn)換卷

輾符號(hào)類型。因此-20變成了宜種非常大的正整數(shù),因此該體垣式計(jì)算出的成果不小于6.道宣鉆封于應(yīng)常頻繁用

到罪符號(hào)數(shù)據(jù)類型的嵌入式系統(tǒng)來^是豐常重要的。假如你答^了造彳固冏題,你也就到了得不到適份工作的邊緣。

2、評價(jià)下面的代碼片斷:

unsignedintzero=0;

unsignedintcompzero=OxFFFF;

/*I'scomplementofzero*/

封于壹種int型不是16位的處理器卷器兌,上面的代碼是不封的的,應(yīng)編寫如下:

unsignedintcompzero=~();

追壹冏題真正能揭發(fā)出應(yīng)試者與否懂得處理器字房的重要性。在我的幺監(jiān)驗(yàn)裹,好的嵌入式程序員非常精確地明白硬

件的細(xì)節(jié)和它的局限,然而PC機(jī)程序往往把硬件作四壹種輾法防止的煩惱。

3、言同意某些令人震驚的構(gòu)造,下面的構(gòu)造是合法的嗎,假如是它做些什么?

inta=5,b=7,c;

c=a+++b;

道他I周題將做卷造他1測驗(yàn)的壹種快樂的結(jié)尾。不管你相不相信,上面的例子是完全合乎言吾法的。冏題是編譯器怎樣

處理它?水平不高的編譯作者實(shí)際上曾爭論道f?冏題,根據(jù)最處理原則,編譯器應(yīng)常能處理盡量所有合法的使用方

法。因此,上面的代碼被處理成:

c-a+++b;

因此,道段代碼持行彳及a=6,b=7,c=12o

假如你懂得答案,或猜出封的答案,做得好。假如你不懂得答案,我也不把51他常作冏題。我發(fā)1用1他冏題的最大

好處是適是壹種有關(guān)代碼編寫圍格,代碼的可^性,代碼的可修改性的好的話題。

4、設(shè)有如下闡明和定義:

typedefunion{longi;intk[5];charc;}DATE;

structdata{intcat;DATEcow;doubledog;}too;

DATEmax;

則言吾句printf(,sizeof(structdate)+sizeof(max));的執(zhí)行成果是?

答、成果是:52。DATE是壹種union,變量公用空間.裹面最大的變量類型是int[5],占用20倜字節(jié).因此它的

大小是20

data是壹種struct,每他變量分^占用空間.依次卷int4+DATE20+double8=32.

因此成果是20+32=52.

常然…在某些16位編輯器下,int也言午是2字節(jié),那么成果是int2+DATE10+double8=20

5、^寫出下列代碼的輸出內(nèi)容a=10;

#includeb=a++;

main()c=++a;

{d=10*a++;

inta,b,c,d;printf(ab,c,d:%d,%d,%d”,b,c,d);

return0;intlen=strlen(src);

)char*dest=(char*)malloc(len+l);〃要分派壹

答:10,12,120種空間

6、寫出下列代碼的輸出內(nèi)容char*d=dest;

gincludechar*s=&src[lenT];〃指向最終壹種字符

intinc(inta)while!len-!=0)

(*d++=*s-;

return(++a);*d=0;〃尾部要加\0

)printf(4<%s\nn,dest);

intmulti(int*a,int*b,int*c)free(dest);〃使用完,應(yīng)富釋放空間,以免導(dǎo)致內(nèi)存

(匯泄露

ieluiu(+c=*a**b),Ietuin0,

})

typedefint(FUNCI)(intin);措施2:

typedefint(FUNC2)(int*,int*,int*);#include

voidshow(FUNC2fun,intargl,int*arg2)#include

(main。

INCp=&inc;(

inttemp=p(argl);charstr□=”hello,world”;

fun(&temp,Sargl,arg2);intlen=strlen(str);

printl(**%d\nw,*argZ);chart;

)for(inti=0;i

mainO(

(t=str[i];

inta;str[i]=str[len-i-1];str[len-i-l]=t;

show(multi,10,&a);)

return0;printf(飛s"?str);

)return0;

答:110)

7、^找出下面代碼中的因此工昔誤8、下面程序有什么^誤?

闡明:如下代碼是把壹種字符串倒序,如“abed”倒序inta[60][250][1000],i,j,k;

彳爰變卷“deba”for(k=0;k<=1000;k++)

1、#includevstring.h,rfor(j=0;j<250;j++)

2、main()for(i=0;i<60;i++)

3、{a⑴[j][k]=0;

4、char*src="hello,world”;答案:把循環(huán)^句內(nèi)外換壹F

5、char*dest二NULL;9、^冏下面程序曾出現(xiàn)什么狀況?

6、intlen=strlen(src);.ttdefineMaxCB500

7、dest=(char*)malloc(len);voidLmiQueryCSmd(StructMSgCB*pmsg)

8、char*d二dest;(

9^char*s=src[lcn];unsignedcharucCmdNum;

10、while(len-!=0)

11、d++=s-;for(ucCmdNum=0;ucCmdNum<MAXCB;UCCMDNUM++)

12、printf("%s”,desl);(

13、return0;

14、}}

答:答案:死循環(huán)

措施1:10、如下3倜有什么區(qū)別

intmain。{char*constp;〃常量指針,p的直不可以修改

char*sre="hello,world”;charconst*p;〃指向常量的指針,指向的常量值不

可以改&a+l不是首地址+1,系統(tǒng)畬認(rèn)卷加壹種a數(shù)組的偏移,

constchar*p;〃和charconst*p是偏移了壹種數(shù)組的大小(本例是5倜int)

11、寫出下面的成果int*ptr=(int*)(&a+l);則ptr實(shí)際是&(a[5]),也就

charstrl[]="abc";是a+5

charstr2[]="abc〃;原因如下:&a是數(shù)組指針,其類型懸int而指

constcharstr3[]="abc";針力口1要根據(jù)指針類型加上壹定的值,

constcharstr4[]="abc〃;不壹樣類型的指針+1之彳爰增晨的大小不壹樣,a是是度

constchar*str5="abc";卷5的int數(shù)組指針,因此要加5*sizeof(int),因此

constchar*str6="abc";ptr實(shí)際是a[5],不遇prt與(&a+l)類型是不壹樣樣的

char*str7="abc";(造黠很重要),因此prtT只f■減去sizeof(int*)。

char*str8="abc";a,&a的地址是同樣的,但意思不壹樣樣,a是數(shù)組首地

uuul<<(strl==bli2)<<endl;址,也就是u[0]的地址,是封象(數(shù)組)首地址,

cout?(str3==str4)<<endl;a+1是數(shù)組下壹元素的地址,即a[l],&a+l是下壹種封

cout<<(str5==str6)<<endl;象的地址,即a[5].

cout<<(str7==str8)?endl;14、^冏如下代碼有什么冏題:

成果是:0011intniain()

解答:strl,str2,str3,str4是數(shù)組變量,它ffl有各自(

的內(nèi)存空間;chara;

而str5,str6,str7,str8是指針,它指向相似的常量char*sti'=&a;

區(qū)域。strcpy(str,"hello");

12、如下代碼中的兩f?sizeo「使用方法打冏題嗎?printf(str);

voidUppercase(charstr[])〃將str中的小寫return0;

字母轉(zhuǎn)換成大寫字母}

(沒有卷str分派內(nèi)存空間,將曾發(fā)生異常

for(size_ti=0;i冏題出在將壹種字符串復(fù)制造壹種字符變量指針?biāo)?/p>

if(<=str[i]&&str[i]<=,z*)地址。雖然可以封的輸出成果,但由于越界迤行內(nèi)在^

str[i]-=('a,,A,);寫而導(dǎo)致程序瓦解。

)char*s:"AAA";

charstr[]="aBcDe";printf("%s”,s);

cout?"str字符晨度卷:"<<s[0]=

sizeof(str)/sizeof(str[0])?endl;printf(“%s”,s);

Uppercase(str);有什么IS?

cout<<str<<endl;〃AAA〃是字符串常量。s是指針,指向迨他字符串常量,

答:函數(shù)內(nèi)的sizeof有周題。根據(jù)畫法,sizeof如用因此申明s的畤候就有冏題。

于數(shù)組,只能測出靜態(tài)數(shù)組的大小,輾法檢測勤態(tài)分派cosntchar*s二〃AAA〃;然彳爰又由于是常量,因此封是s[0]

的或外部數(shù)組大小。函數(shù)外的str是壹種靜態(tài)定義的數(shù)的賦值操作是不合法的。

組,因此其大小卷6,函數(shù)內(nèi)的str實(shí)際只是壹種指向15、有如下體現(xiàn)式:

字符串的指針,沒有任何額外的與數(shù)組有關(guān)的信息,因inta=248;b=4;intconstc=21;constint*d=&a;

此sizeof作用于上只將其常指針看,壹種指針4值1int*conste=&b;intconst*fconst=&a;

字節(jié),因此返回4。下列體現(xiàn)式哪些畬被編譯器嚴(yán)禁?懸何?

13、寫出輸出成果*c=32;d=&b;*d=43;c=34;e=&a;f=0x321f;

main()*c道是值I什么柬束,嚴(yán)禁

(*d^了是const,嚴(yán)禁

inta[5]={l,2,3,4,5);e=&a焉兌了是const嚴(yán)禁

int*ptr=(int*)(&a+l);const*fconst=&a;嚴(yán)禁

printf("%d,%d”,*(a+l),*(ptr-l));16、互換兩值1變量的值,不使用第三flSI變量。

)即a-3,b-5,互換之彳奏a=5,b-3;

輸出:2,5有兩種解法,壹種用算術(shù)算法,壹種用X異或)

*(a+l)就是a[l],*(ptrT)就是a[4],執(zhí)行成果是2,a=a+b;b=a-b;a=a-b;

5or

a=ab;b=a'b;a=a'b;//只能封int,char..charc=128;

orprintf(Mc=%d\nw,c);

a'=b"=a;第豈題,?A=Oxfffffff5,int值A(chǔ)-11,但輸出的

17、下面的程序畬出現(xiàn)什么成果是uint。因此輸出

.#include第二鹿,c=0X10,輸出的是int,最高位懸1,是負(fù)數(shù),

8include因此它的值就是0X00的補(bǔ)碼就是128,因此輸出一128。

voidgelmemory(char*p)追兩道題都是在考察二暹制向ini或uinl轉(zhuǎn)換疇的最

{p=(char*)malloc(100);高位處理。

strcpy(p,MhelloworldM;23、分析下面的程序:

)voidGetMemory(char**p,intnum)

intmain()(

{char*5lx-NULL;*p=(uhui*)iiicillvc(nuiii),

getmemory(str);)

printf(M%s/nw,str);intmain()

free(str);(

return0;char*str=NULL;

)GetMemory(&str,100);

程序瓦解,getmcmoi'y中的malloc不能返回勃態(tài)內(nèi)存,strepy(str,"hello”);

free()封str操作很危險(xiǎn)free(str);

18、下面的^句佛出現(xiàn)什么成果?if(str!=NULL)

charszstr[10];{

strepy(szstr,M;strepy(str,nworld");

答案:辰度不壹樣樣,畬導(dǎo)致非法的OS,應(yīng)常改卷char}

szstr[l1];printf(M\nstris%s”,str);

19>(void*)ptr和(*(void**))ptr的成果與否相似?gctchar();

答:其中ptr懸同壹種指針,(void*)ptr和)

(*(void**))ptr值是相似的冏輸出成果是什么?但愿大家能^言兌原因,先了

20、冏函數(shù)既然不曾被其他函數(shù)調(diào)用,懸何要返回1?輸出strisworldo

intmain()free只是釋放的str指向的內(nèi)存空間,它自身的值遢是

(存在的.

intx=3;因此free之彳炎,有壹種好的習(xí)慣就是將str=NULL.

printf(4<%dw,x);此畤str指向空間的內(nèi)存已被回收,假如輸出^句之前

return1;遢存在分派空間的操作的話,迨段存儲(chǔ)空間是也^被重

}新分派其他變量的,

答:mian中,c原則認(rèn)懸0表到達(dá)功,非0表達(dá)名音誤。盡管道段程序確實(shí)是存在大大的冏堰(上面各位已4筌^

詳細(xì)的值是某中詳細(xì)出余昔信息

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論