當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式招聘 > 嵌入式面試題 > 嵌入式工程師筆試題目
嵌入式工程師對(duì)于工作來(lái)說(shuō)最重要的就是面試+筆試了,作為一個(gè)面試過(guò)很多家的老鳥(niǎo)來(lái)說(shuō),總結(jié)了一些嵌入式工程師經(jīng)典筆試題,而且也是很廠家的,快看看你都掌握了沒(méi)
1.給兩個(gè)變量,如何找出一個(gè)帶環(huán)單鏈表中是什么地方出現(xiàn)環(huán)的?
一個(gè)遞增一,一個(gè)遞增二,他們指向同一個(gè)接點(diǎn)時(shí)就是環(huán)出現(xiàn)的地方
1)。.堆棧溢出一般是由什么原因?qū)е碌?
沒(méi)有回收垃圾資源
3).不能做switch()的參數(shù)類型是:
switch的參數(shù)不能為實(shí)型。
4)、隊(duì)列和棧有什么區(qū)別?
隊(duì)列先進(jìn)先出,棧后進(jìn)先出
2.什么是引用,引用與指針有什么區(qū)別?
1) 引用必須被初始化,指針不必。
2) 引用初始化以后不能被改變,指針可以改變所指的對(duì)象。
3) 不存在指向空值的引用,但是存在指向空值的指針。
3.A.c 和B.c兩個(gè)c文件中使用了兩個(gè)相同名字的static變量,編譯的時(shí)候會(huì)不會(huì)有問(wèn)題?這兩個(gè)static變量會(huì)保存到哪里(棧還是堆或者其他的)?
static的全局變量,表明這個(gè)變量?jī)H在本模塊中有意義,不會(huì)影響其他模塊。
他們都放在數(shù)據(jù)區(qū),但是編譯器對(duì)他們的命名是不同的。
如果要使變量在其他模塊也有意義的話,需要使用extern關(guān)鍵字。
4.什么是二叉樹(shù),平衡二叉樹(shù)?
左右子樹(shù)都是平衡二叉樹(shù) 且左右子樹(shù)的深度差值的絕對(duì)值不大于1
5.internet采用哪種網(wǎng)絡(luò)協(xié)議,該協(xié)議的主要層次是什么?
Tcp/IP 主要層次有應(yīng)用層 傳輸層 網(wǎng)絡(luò)層 數(shù)據(jù)鏈路層 物理層
ISO的七層模型是什么?
應(yīng)用層 表示層 會(huì)話層 傳輸層 網(wǎng)絡(luò)層 物理鏈路層 物理層
Tcp udp屬于運(yùn)輸層
Tcp服務(wù)提供了數(shù)據(jù)流傳輸,可靠性,有效流控制,全雙工操作和多路復(fù)用技術(shù)
Udp不提供可靠性,流控制以及錯(cuò)誤恢復(fù)功能 udp頭包含少,負(fù)載消耗小。
優(yōu)缺點(diǎn):
Tcp提供可靠的傳輸服務(wù),有流量控制。缺點(diǎn)是包頭大,冗余性不好。
Udp不提供穩(wěn)定的服務(wù) 但包頭小 開(kāi)銷小。
Internet物理地址和ip地址轉(zhuǎn)換采用什么協(xié)議?
ARP(地址解析協(xié)議)
IP地址的編碼分為那兩部分?
網(wǎng)絡(luò)號(hào) 和主機(jī)號(hào) 不過(guò)要與子網(wǎng)掩碼與之后才能區(qū)分哪是網(wǎng)絡(luò)號(hào)那是主機(jī)號(hào)。
6.用戶輸入M,N值,從1至N開(kāi)始順序循環(huán)數(shù)數(shù),每數(shù)到M輸出該數(shù)值,直至全部輸出。寫(xiě)出C程序。
循環(huán)鏈表,用取余操作做
7..不能做switch()的參數(shù)類型是:
switch的參數(shù)不能為實(shí)型。
進(jìn)程和線程的區(qū)別是什么?
進(jìn)程是程序的一次執(zhí)行
線程是進(jìn)程內(nèi)的一個(gè)執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體。
與進(jìn)程的區(qū)別:
調(diào)度:線程是可調(diào)度和分配的基本單元,進(jìn)程是擁有資源的基本單位。
并發(fā)性:不同進(jìn)程和同一個(gè)進(jìn)程中的多個(gè)線程都可以并發(fā)。
擁有資源:進(jìn)程是擁有資源的獨(dú)立單位,而線程不擁有資源,但它可以訪問(wèn)屬于進(jìn)程的資源。
系統(tǒng)開(kāi)銷:由于創(chuàng)建進(jìn)程和撤銷進(jìn)程 系統(tǒng)都要為之分配和回收資源,所以系統(tǒng)的開(kāi)銷明顯大于線程創(chuàng)建和撤銷時(shí)的開(kāi)銷
8.談?wù)凜OM的線程模型。然后討論進(jìn)程內(nèi)/外組件的差別。
1網(wǎng)絡(luò)編程中設(shè)計(jì)并發(fā)服務(wù)器,使用多進(jìn)程 與 多線程 ,請(qǐng)問(wèn)有什么區(qū)別?
1) 進(jìn)程:子進(jìn)程是父進(jìn)程的復(fù)制,它獲得父進(jìn)程數(shù)據(jù)空間,堆 棧的復(fù)制品。
2) 線程:相對(duì)于進(jìn)程而言,線程更接近于一個(gè)執(zhí)行體的概念,它可以與同進(jìn)程的其他線程同享進(jìn)程資源,但同時(shí)擁有自己的?臻g,寄存器,指針(獨(dú)立的執(zhí)行序列)。
3) 兩者都可以提高程序的并發(fā)度,提高程序的運(yùn)行效率和響應(yīng)。
4) 線程和進(jìn)程各有優(yōu)缺點(diǎn),線程開(kāi)銷少,但不利于資源管理和保護(hù)。而進(jìn)程恰恰相反,開(kāi)銷大,但對(duì)資源有獨(dú)立掌控權(quán),可更好地管理。
2.列舉幾種進(jìn)程的同步機(jī)制
1)原子操作
2)信號(hào)量機(jī)制
3)自旋鎖
4)管程,會(huì)合,分布式系統(tǒng)
3 進(jìn)程間的通訊的途徑
共享存儲(chǔ)系統(tǒng)
消息傳遞系統(tǒng)
管道:以文件系統(tǒng)為基礎(chǔ)
9.進(jìn)程死鎖的原因
資源競(jìng)爭(zhēng)及進(jìn)程推進(jìn)順序非法
10.死鎖的4個(gè)必要條件
互斥、請(qǐng)求保持、不可剝奪、環(huán)路
11.死鎖的處理
鴕鳥(niǎo)策略、預(yù)防策略、避免策略、檢測(cè)與解除死鎖
12. 操作系統(tǒng)中進(jìn)程調(diào)度策略有哪幾種?
FCFS(先來(lái)先服務(wù)),優(yōu)先級(jí),時(shí)間片輪轉(zhuǎn),多級(jí)反饋
13.數(shù)組和鏈表的區(qū)別
數(shù)組:數(shù)據(jù)順序存儲(chǔ),固定大小
連表:數(shù)據(jù)可以隨機(jī)存儲(chǔ),大小可動(dòng)態(tài)改變
面試題: 線程與進(jìn)程的區(qū)別和聯(lián)系? 線程是否具有相同的堆棧? dll是否有獨(dú)立的堆棧?
進(jìn)程是死的,只是一些資源的集合,真正的程序執(zhí)行都是線程來(lái)完成的,程序啟動(dòng)的時(shí)候操作系統(tǒng)就幫你創(chuàng)建了一個(gè)主線程。
14.每個(gè)線程有自己的堆棧。
DLL中有沒(méi)有獨(dú)立的堆棧,這個(gè)問(wèn)題不好回答,或者說(shuō)這個(gè)問(wèn)題本身是否有問(wèn)題。因?yàn)镈LL中的代碼是被某些線程所執(zhí)行,只有線程擁有堆棧,如果DLL中的代碼是EXE中的線程所調(diào)用,那么這個(gè)時(shí)候是不是說(shuō)這個(gè)DLL沒(méi)有自己獨(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)致程序崩潰
用宏定義寫(xiě)出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
上述三個(gè)有什么區(qū)別?
char * const p; //常量指針,p的值不可以修改
char const * p;//指向常量的指針,指向的常量值不可以改
const char *p; //和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;
結(jié)果是:0 0 1 1
解答:str1,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間;
而str5,str6,str7,str8是指針,它們指向相同的常量區(qū)域。
15. 以下代碼中的兩個(gè)sizeof用法有問(wèn)題嗎?[C易]
void UpperCase( char str[] ) // 將 str 中的小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字母
{
for( size_t i=0; i
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str字符長(zhǎng)度為: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答:函數(shù)內(nèi)的sizeof有問(wèn)題。根據(jù)語(yǔ)法,sizeof如用于數(shù)組,只能測(cè)出靜態(tài)數(shù)組的大小,無(wú)法檢測(cè)動(dòng)態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是一個(gè)靜態(tài)定義的數(shù)組,因此其大小為6,函數(shù)內(nèi)的str實(shí)際只是一個(gè)指向字符串的指針,沒(méi)有任何額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,一個(gè)指針為4個(gè)字節(jié),因此返回4。
16.main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
輸出:2,5
*(a+1)就是a[1],*(ptr-1)就是a[4],執(zhí)行結(jié)果是2,5
&a+1不是首地址+1,系統(tǒng)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移,是偏移了一個(gè)數(shù)組的大小(本例是5個(gè)int)
int *ptr=(int *)(&a+1);
則ptr實(shí)際是&(a[5]),也就是a+5
原因如下:
&a是數(shù)組指針,其類型為 int (*)[5];
而指針加1要根據(jù)指針類型加上一定的值,
不同類型的指針+1之后增加的大小不同
a是長(zhǎng)度為5的int數(shù)組指針,所以要加 5*sizeof(int)
所以ptr實(shí)際是a[5]
但是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要)
所以prt-1只會(huì)減去sizeof(int*)
a,&a的地址是一樣的,但意思不一樣,a是數(shù)組首地址,也就是a[0]的地址,&a是對(duì)象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個(gè)對(duì)象的地址,即a[5].