嵌入式工(gong)程師筆試題目
時間(jian):2018-08-15 來源:未知(zhi)
嵌入式工程師對于工作來說最重要的就是面試+筆試了,作為一個面試過很多家的老鳥來說,總結了一些嵌入式工程師經典筆試題,而且也是很廠家的,快看看你都掌握了沒
1.給兩(liang)個(ge)變(bian)量,如何找出一個(ge)帶環單鏈表中是什(shen)么地方出現環的?
一(yi)個(ge)遞增(zeng)一(yi),一(yi)個(ge)遞增(zeng)二,他們指向同一(yi)個(ge)接點(dian)時就是(shi)環出現的地方
1)。.堆棧(zhan)溢出一般是由什么原(yuan)因導致(zhi)的?
沒(mei)有回收垃圾資源
3).不能(neng)做switch()的參數類型是:
switch的參(can)數不(bu)能(neng)為實型。
4)、隊(dui)列和棧(zhan)有什么區(qu)別?
隊列先進先出,棧后進先出
2.什么(me)(me)是(shi)引用(yong),引用(yong)與指針有什么(me)(me)區(qu)別?
1) 引用(yong)必須被(bei)初始化,指針不(bu)必。
2) 引用初(chu)始化以后不能被改變(bian),指(zhi)針可以改變(bian)所指(zhi)的對象。
3) 不存在指向空值的引用,但(dan)是存在指向空值的指針。
3.A.c 和(he)B.c兩個c文件中使用了兩個相同名(ming)字的(de)static變量,編譯的(de)時候會(hui)不會(hui)有問題(ti)?這兩個static變量會(hui)保(bao)存(cun)到哪里(棧(zhan)還是堆或者其他的(de))?
static的全局變量(liang),表明(ming)這(zhe)個變量(liang)僅(jin)在本模(mo)塊中有意義(yi),不會影響(xiang)其他模(mo)塊。
他們都放在(zai)數(shu)據(ju)區,但是編譯器對(dui)他們的命名是不同(tong)的。
如果要(yao)(yao)使變(bian)量在(zai)其他模(mo)塊也有意義(yi)的(de)話,需要(yao)(yao)使用(yong)extern關鍵(jian)字(zi)。
4.什么是二(er)(er)叉樹,平衡二(er)(er)叉樹?
左右(you)子(zi)樹都是(shi)平衡(heng)二(er)叉樹 且左右(you)子(zi)樹的深度差(cha)值(zhi)的絕對值(zhi)不大于1
5.internet采用哪種網絡協(xie)議(yi),該協(xie)議(yi)的主要(yao)層次是(shi)什么?
Tcp/IP 主要(yao)層次(ci)有應(ying)用層 傳(chuan)輸層 網絡層 數據鏈路層 物理層
ISO的(de)七層模(mo)型(xing)是什么?
應用層(ceng) 表示層(ceng) 會話層(ceng) 傳輸層(ceng) 網絡(luo)層(ceng) 物理鏈(lian)路層(ceng) 物理層(ceng)
Tcp udp屬于運輸層
Tcp服(fu)務提(ti)供了數據流(liu)(liu)傳輸,可靠性,有效(xiao)流(liu)(liu)控制,全雙工操(cao)作(zuo)和多路(lu)復用技術
Udp不(bu)提供(gong)可靠性,流控制以(yi)及錯誤恢復功能(neng) udp頭包(bao)含少,負載消耗小(xiao)。
優缺點:
Tcp提供可靠的(de)傳(chuan)輸服務,有流量控(kong)制。缺點是包頭大,冗余性(xing)不好(hao)。
Udp不提供穩定的(de)服務 但包頭小 開銷小。
Internet物理地(di)址(zhi)和ip地(di)址(zhi)轉換(huan)采(cai)用什么協議?
ARP(地址(zhi)解析協議)
IP地(di)址(zhi)的編碼分為(wei)那(nei)兩(liang)部(bu)分?
網絡號(hao) 和主(zhu)機號(hao) 不(bu)過要與子(zi)網掩碼(ma)與之后才能區分哪是網絡號(hao)那是主(zhu)機號(hao)。
6.用戶輸入M,N值(zhi),從1至(zhi)N開始(shi)順(shun)序循環數(shu)數(shu),每(mei)數(shu)到M輸出(chu)該數(shu)值(zhi),直至(zhi)全部(bu)輸出(chu)。寫出(chu)C程序。
循(xun)環鏈表,用取余操(cao)作做
7..不能做switch()的參數類型(xing)是:
switch的參數不能為(wei)實型。
進程和(he)線程的區別是什么?
進程是程序的一次執行
線程是進程內的(de)一個執行單(dan)元,也是進程內的(de)可(ke)調度實體。
與進程的區別:
調度:線程是(shi)(shi)可(ke)調度和(he)分配的基本單元(yuan),進程是(shi)(shi)擁有資源(yuan)的基本單位(wei)。
并發性(xing):不同(tong)進程和(he)同(tong)一個進程中的多(duo)個線程都可以并發。
擁有資(zi)源:進(jin)程(cheng)(cheng)是擁有資(zi)源的(de)獨立(li)單(dan)位,而線程(cheng)(cheng)不擁有資(zi)源,但它可(ke)以訪問屬于進(jin)程(cheng)(cheng)的(de)資(zi)源。
系統(tong)開銷:由于創建進程(cheng)和(he)撤(che)(che)銷進程(cheng) 系統(tong)都要(yao)為之分配和(he)回收資源,所以系統(tong)的開銷明顯大(da)于線程(cheng)創建和(he)撤(che)(che)銷時的開銷
8.談談COM的(de)線程模型。然后討論進程內/外(wai)組件的(de)差別。
1網絡編程(cheng)(cheng)中設(she)計并發服(fu)務器(qi),使(shi)用多進程(cheng)(cheng) 與(yu) 多線程(cheng)(cheng) ,請問有什么區別(bie)?
1) 進(jin)程(cheng):子(zi)進(jin)程(cheng)是父進(jin)程(cheng)的(de)復制(zhi),它(ta)獲得父進(jin)程(cheng)數據空(kong)間,堆 棧的(de)復制(zhi)品。
2) 線程(cheng):相對于(yu)進程(cheng)而言(yan),線程(cheng)更接近于(yu)一個(ge)執(zhi)行(xing)體的概(gai)念,它可以與同進程(cheng)的其他(ta)線程(cheng)同享(xiang)進程(cheng)資源,但同時擁有自(zi)己的棧空間(jian),寄存器,指針(獨立(li)的執(zhi)行(xing)序列)。
3) 兩者(zhe)都可以(yi)提高程序(xu)的(de)并發(fa)度,提高程序(xu)的(de)運行效率(lv)和響應(ying)。
4) 線(xian)程(cheng)和(he)進(jin)程(cheng)各(ge)有優(you)缺點(dian),線(xian)程(cheng)開銷少,但(dan)不利(li)于資源管理(li)和(he)保(bao)護。而進(jin)程(cheng)恰恰相反,開銷大,但(dan)對資源有獨立掌控權,可更好地管理(li)。
2.列舉幾種進(jin)程的(de)同步(bu)機制
1)原(yuan)子操作
2)信號量機制
3)自旋鎖
4)管程,會合,分布式系統
3 進程間的通訊(xun)的途徑
共享(xiang)存儲(chu)系(xi)統(tong)
消息傳遞系統
管道:以(yi)文件系(xi)統(tong)為基礎
9.進程死鎖的原因(yin)
資源競爭(zheng)及進程(cheng)推進順(shun)序非法
10.死(si)鎖的4個必要條件
互斥、請求保持(chi)、不可剝奪、環(huan)路
11.死鎖的處(chu)理(li)
鴕鳥策(ce)略(lve)、預防策(ce)略(lve)、避免策(ce)略(lve)、檢測與解(jie)除死鎖
12. 操(cao)作系統中進程調度策略有哪幾種?
FCFS(先(xian)來(lai)先(xian)服務(wu)),優先(xian)級(ji),時間(jian)片(pian)輪轉,多級(ji)反饋(kui)
13.數(shu)組和鏈表的區別
數組:數據順序存儲,固(gu)定大(da)小
連表:數據(ju)可以隨機存儲,大小(xiao)可動態改變
面試題: 線(xian)程(cheng)與進程(cheng)的(de)(de)(de)區別和聯(lian)系? 線(xian)程(cheng)是(shi)否(fou)具有相同的(de)(de)(de)堆棧? dll是(shi)否(fou)有獨立的(de)(de)(de)堆棧?
進程(cheng)(cheng)是死(si)的(de)(de),只(zhi)是一(yi)些資源的(de)(de)集合(he),真(zhen)正(zheng)的(de)(de)程(cheng)(cheng)序(xu)執行都是線(xian)(xian)程(cheng)(cheng)來完成(cheng)的(de)(de),程(cheng)(cheng)序(xu)啟(qi)動的(de)(de)時候(hou)操作系統就幫你創(chuang)建(jian)了一(yi)個(ge)主線(xian)(xian)程(cheng)(cheng)。
14.每個線程有自己的堆棧(zhan)。
DLL中有沒(mei)有獨立的(de)(de)堆(dui)棧(zhan)(zhan),這(zhe)個問(wen)題(ti)不(bu)好回答,或者(zhe)說這(zhe)個問(wen)題(ti)本(ben)身是(shi)(shi)否有問(wen)題(ti)。因為DLL中的(de)(de)代(dai)碼是(shi)(shi)被某些線(xian)程(cheng)(cheng)所執(zhi)行(xing),只有線(xian)程(cheng)(cheng)擁有堆(dui)棧(zhan)(zhan),如(ru)果(guo)DLL中的(de)(de)代(dai)碼是(shi)(shi)EXE中的(de)(de)線(xian)程(cheng)(cheng)所調(diao)用(yong),那(nei)么這(zhe)個時候(hou)是(shi)(shi)不(bu)是(shi)(shi)說這(zhe)個DLL沒(mei)有自己獨立的(de)(de)堆(dui)棧(zhan)(zhan)?如(ru)果(guo)DLL中的(de)(de)代(dai)碼是(shi)(shi)由DLL自己創建的(de)(de)線(xian)程(cheng)(cheng)所執(zhi)行(xing),那(nei)么是(shi)(shi)不(bu)是(shi)(shi)說DLL有獨立的(de)(de)堆(dui)棧(zhan)(zhan)?
以上講的(de)是(shi)(shi)堆棧(zhan),如(ru)果(guo)對于堆來說,每(mei)個(ge)DLL有(you)自己的(de)堆,所以如(ru)果(guo)是(shi)(shi)從DLL中(zhong)動態分配的(de)內存(cun),最(zui)好是(shi)(shi)從DLL中(zhong)刪(shan)除,如(ru)果(guo)你從DLL中(zhong)分配內存(cun),然后(hou)在EXE中(zhong),或者另(ling)外一個(ge)DLL中(zhong)刪(shan)除,很(hen)有(you)可能導致程(cheng)序崩潰
用(yong)宏定義寫出swap(x,y)
#define swap(x,y) (x=x+y;y=x-y;x=x-y)
char * const p;
char const * p
const char *p
上述三(san)個有什么(me)區別?
char * const p; //常量指針,p的值(zhi)不可以修改
char const * p;//指向常量(liang)的(de)指針,指向的(de)常量(liang)值不可以改
const char *p; //和(he)char const *p
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
結果是:0 0 1 1
解答(da):str1,str2,str3,str4是數組變量,它們有各自的內存空間(jian);
而str5,str6,str7,str8是(shi)指針,它們指向相同的常量區域。
15. 以下代碼中的兩(liang)個sizeof用法(fa)有問(wen)題(ti)嗎?[C易]
void UpperCase( char str[] ) // 將(jiang) str 中的小寫(xie)字母轉換成(cheng)大寫(xie)字母
{
for( size_t i=0; i
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str字符(fu)長(chang)度(du)為: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答:函(han)數內(nei)(nei)的(de)(de)sizeof有問題。根據語法,sizeof如用(yong)于(yu)數組,只能測出(chu)靜態數組的(de)(de)大小,無(wu)法檢測動(dong)態分(fen)配的(de)(de)或(huo)外部(bu)數組大小。函(han)數外的(de)(de)str是(shi)一個(ge)靜態定義的(de)(de)數組,因此(ci)其(qi)大小為6,函(han)數內(nei)(nei)的(de)(de)str實際只是(shi)一個(ge)指向字符串的(de)(de)指針(zhen),沒有任何額外的(de)(de)與(yu)數組相(xiang)關的(de)(de)信息,因此(ci)sizeof作用(yong)于(yu)上只將其(qi)當指針(zhen)看,一個(ge)指針(zhen)為4個(ge)字節,因此(ci)返回(hui)4。
16.main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
輸(shu)出:2,5
*(a+1)就是a[1],*(ptr-1)就是a[4],執行結(jie)果是2,5
&a+1不是(shi)首(shou)地址+1,系統會(hui)認為(wei)加一個(ge)a數組的(de)偏移,是(shi)偏移了(le)一個(ge)數組的(de)大(da)小(xiao)(本例(li)是(shi)5個(ge)int)
int *ptr=(int *)(&a+1);
則ptr實際(ji)是&(a[5]),也就是a+5
原因如下:
&a是(shi)數組(zu)指針,其(qi)類型為 int (*)[5];
而指針加1要根據指針類(lei)型加上一定的(de)值,
不同類型(xing)的指針+1之(zhi)后增加的大小不同
a是長度為(wei)5的int數(shu)組指針,所以要加 5*sizeof(int)
所以ptr實(shi)際是(shi)a[5]
但是(shi)prt與(&a+1)類型是(shi)不(bu)一樣的(de)(這點很重要)
所以prt-1只會(hui)減去sizeof(int*)
a,&a的(de)地(di)(di)址(zhi)是(shi)(shi)(shi)一樣的(de),但意思不一樣,a是(shi)(shi)(shi)數組首地(di)(di)址(zhi),也就(jiu)是(shi)(shi)(shi)a[0]的(de)地(di)(di)址(zhi),&a是(shi)(shi)(shi)對(dui)象(數組)首地(di)(di)址(zhi),a+1是(shi)(shi)(shi)數組下一元素的(de)地(di)(di)址(zhi),即a[1],&a+1是(shi)(shi)(shi)下一個(ge)對(dui)象的(de)地(di)(di)址(zhi),即a[5].