嵌入式C語言面試題大集合,都是自己總結的
時間:2018-08-24 來(lai)源:未知
現在發展最快(kuai)的(de)(de)也就(jiu)是IT行業了(le),嵌入式就(jiu)是其中之一(yi)(yi),很多剛學出來(lai)的(de)(de)去找工作,一(yi)(yi)般都會(hui)是被(bei)面試(shi)題給(gei)難(nan)住了(le),與理想工作失之交臂,我面試(shi)了(le)那(nei)么多家,總(zong)結(jie)出了(le)一(yi)(yi)點規律,一(yi)(yi)般C語(yu)言是必(bi)考(kao)的(de)(de),題里(li)面必(bi)有的(de)(de),今天(tian)我總(zong)結(jie)出來(lai)一(yi)(yi)下C語(yu)言面試(shi)題,希(xi)望可(ke)以幫到你(ni)。
1. 關鍵(jian)字(zi)static有什么(me)用途?(請至少說明(ming)兩種(zhong))
1.限制變量(liang)(liang)的作用域2.設置(zhi)變量(liang)(liang)的存儲域
2. 引(yin)用與指針(zhen)有什么區別?
1) 引用必須被初始(shi)化,指針不必。
2) 引用初始(shi)化(hua)以(yi)后不能(neng)被改(gai)變(bian),指針可以(yi)改(gai)變(bian)所指的對象。
2) 不存在(zai)指向空(kong)值(zhi)(zhi)的引用,但是存在(zai)指向空(kong)值(zhi)(zhi)的指針。NULL
3. 描述(shu)實(shi)時系統的(de)基本特性
在特(te)定時(shi)間內完成特(te)定的(de)任(ren)務,實時(shi)性與可(ke)靠性
5. 什么是平衡二叉樹?
左右子樹(shu)(shu)都(dou)是平衡二叉樹(shu)(shu) 且左右子樹(shu)(shu)的深度差值的絕(jue)對值不(bu)大于(yu)1
6. 堆(dui)棧(zhan)溢出一(yi)般(ban)是由什么原因導致的?
沒有回收(shou)垃圾資(zi)源
7. 什么(me)函(han)數(shu)不能聲明為虛函(han)數(shu)?
構造函(han)數,因(yin)為它(ta)是(shi)在(zai)對(dui)象(xiang)產生(sheng)之(zhi)頭被調用(yong)的,而(er)虛(xu)函(han)數是(shi)對(dui)象(xiang)產生(sheng)之(zhi)后(hou)才起作用(yong)的機制(zhi),所以聲明虛(xu)構造函(han)數無意(yi)義(yi)。
8. 冒(mao)泡(pao)排(pai)序算法的時間(jian)復(fu)雜度是什么?
O(n^2)
9 寫出float x 與“零(ling)值”比較的if語句。
if(x>0.000001&&x<-0.000001)//見(jian)高質量C++編程(cheng)一書
10. Internet采(cai)用哪(na)種(zhong)網絡(luo)協(xie)(xie)議(yi)?該(gai)協(xie)(xie)議(yi)的主要層(ceng)次結構(gou)?
tcp/ip 應用(yong)層(ceng)/傳(chuan)輸層(ceng)/網絡(luo)層(ceng)/鏈路(lu)層(ceng)
11. Internet物(wu)理地址和(he)IP地址轉(zhuan)換采用(yong)什么協議?
ARP (Address Resolution Protocol )
12. IP地址的編碼分為哪(na)倆部分?
IP地(di)址由兩部分組成(cheng),網(wang)絡號和主機(ji)號。不過是要和“子網(wang)掩碼(ma)”按位(wei)與上之(zhi)后才能區分哪些是網(wang)絡位(wei)哪些是主機(ji)位(wei)。
13. 不能做switch()的參數類型是:
實型。
14、局部變量能否和全局變量重名(ming)?
答:能,局部會屏蔽全局。要用全局變量,需要使用"::"
局(ju)部(bu)變(bian)(bian)量(liang)(liang)可以與(yu)全(quan)局(ju)變(bian)(bian)量(liang)(liang)同(tong)名(ming),在(zai)函數內(nei)引用這個變(bian)(bian)量(liang)(liang)時(shi),會用到同(tong)名(ming)的(de)(de)局(ju)部(bu)變(bian)(bian)量(liang)(liang),而(er)不會用到全(quan)局(ju)變(bian)(bian)量(liang)(liang)。對(dui)于有(you)些(xie)編譯器(qi)而(er)言,在(zai)同(tong)一個函數內(nei)可以定義(yi)多個同(tong)名(ming)的(de)(de)局(ju)部(bu)變(bian)(bian)量(liang)(liang),比如(ru)在(zai)兩(liang)個循環(huan)(huan)體內(nei)都定義(yi)一個同(tong)名(ming)的(de)(de)局(ju)部(bu)變(bian)(bian)量(liang)(liang),而(er)那個局(ju)部(bu)變(bian)(bian)量(liang)(liang)的(de)(de)作(zuo)用域就(jiu)在(zai)那個循環(huan)(huan)體內(nei)
15、如何引用一個已經定義過的全局變(bian)量?
答:extern關鍵字
可(ke)以(yi)用(yong)(yong)引用(yong)(yong)頭(tou)文(wen)件的方(fang)式(shi)(shi),也可(ke)以(yi)用(yong)(yong)extern關鍵字(zi),如(ru)(ru)果用(yong)(yong)引用(yong)(yong)頭(tou)文(wen)件方(fang)式(shi)(shi)來(lai)引用(yong)(yong)某個在頭(tou)文(wen)件中聲明的全局變理(li),假(jia)定你將那(nei)個變寫(xie)錯(cuo)了(le),那(nei)么(me)在編譯(yi)期(qi)間(jian)會報錯(cuo),如(ru)(ru)果你用(yong)(yong)extern方(fang)式(shi)(shi)引用(yong)(yong)時,假(jia)定你犯了(le)同樣的錯(cuo)誤,那(nei)么(me)在編譯(yi)期(qi)間(jian)不會報錯(cuo),而(er)在連(lian)接期(qi)間(jian)報錯(cuo)。
16、全局(ju)變量可(ke)不可(ke)以定(ding)義在可(ke)被多(duo)個.C文件包含的(de)頭文件中?為(wei)什么?
答:可以,在不同(tong)的C文件中以static形式來聲明同(tong)名全(quan)局變量。
可以在不(bu)同(tong)的C文件(jian)中聲明(ming)同(tong)名的全(quan)局變量,前提(ti)是其中只(zhi)能(neng)有一個C文件(jian)中對此(ci)變量賦(fu)初值,此(ci)時(shi)連接不(bu)會出錯
17、static全局變量(liang)與普通(tong)的全局變量(liang)有什么(me)區別?static局部變量(liang)和(he)普通(tong)局部變量(liang)有什么(me)區別?static函數與普通(tong)函數有什么(me)區別?
全(quan)(quan)局(ju)(ju)變(bian)(bian)量(liang)(外(wai)部變(bian)(bian)量(liang))的(de)說明(ming)之前(qian)再(zai)冠以static 就(jiu)構成了靜(jing)態(tai)的(de)全(quan)(quan)局(ju)(ju)變(bian)(bian)量(liang)。全(quan)(quan)局(ju)(ju)變(bian)(bian)量(liang)本(ben)身(shen)就(jiu)是(shi)靜(jing)態(tai)存(cun)儲方式, 靜(jing)態(tai)全(quan)(quan)局(ju)(ju)變(bian)(bian)量(liang)當(dang)然也是(shi)靜(jing)態(tai)存(cun)儲方式。這兩(liang)者在(zai)(zai)存(cun)儲方式上(shang)并無(wu)不同。這兩(liang)者的(de)區別(bie)雖在(zai)(zai)于非靜(jing)態(tai)全(quan)(quan)局(ju)(ju)變(bian)(bian)量(liang)的(de)作(zuo)用(yong)(yong)域是(shi)整個源(yuan)程序(xu),當(dang)一個源(yuan)程序(xu)由多個源(yuan)文(wen)件組成時,非靜(jing)態(tai)的(de)全(quan)(quan)局(ju)(ju)變(bian)(bian)量(liang)在(zai)(zai)各個源(yuan)文(wen)件中(zhong)都(dou)是(shi)有效(xiao)的(de)。 而靜(jing)態(tai)全(quan)(quan)局(ju)(ju)變(bian)(bian)量(liang)則限制了其(qi)作(zuo)用(yong)(yong)域, 即只在(zai)(zai)定義該(gai)變(bian)(bian)量(liang)的(de)源(yuan)文(wen)件內有效(xiao),在(zai)(zai)同一源(yuan)程序(xu)的(de)其(qi)它(ta)源(yuan)文(wen)件中(zhong)不能(neng)使用(yong)(yong)它(ta)。由于靜(jing)態(tai)全(quan)(quan)局(ju)(ju)變(bian)(bian)量(liang)的(de)作(zuo)用(yong)(yong)域局(ju)(ju)限于一個源(yuan)文(wen)件內,只能(neng)為該(gai)源(yuan)文(wen)件內的(de)函數公用(yong)(yong),因此可以避免在(zai)(zai)其(qi)它(ta)源(yuan)文(wen)件中(zhong)引起錯誤。
從以(yi)上分析可以(yi)看出, 把局部變(bian)量改(gai)(gai)變(bian)為(wei)靜態變(bian)量后(hou)是改(gai)(gai)變(bian)了(le)(le)它的存儲方式(shi)即改(gai)(gai)變(bian)了(le)(le)它的生存期。把全局變(bian)量改(gai)(gai)變(bian)為(wei)靜態變(bian)量后(hou)是改(gai)(gai)變(bian)了(le)(le)它的作用(yong)域, 限制了(le)(le)它的使用(yong)范圍。
static函(han)(han)數(shu)與普通函(han)(han)數(shu)作(zuo)用(yong)域不同。僅在(zai)(zai)本文(wen)(wen)件(jian)。只(zhi)在(zai)(zai)當前(qian)源(yuan)文(wen)(wen)件(jian)中(zhong)使用(yong)的函(han)(han)數(shu)應(ying)(ying)該(gai)(gai)說明為(wei)內(nei)部(bu)函(han)(han)數(shu)(static),內(nei)部(bu)函(han)(han)數(shu)應(ying)(ying)該(gai)(gai)在(zai)(zai)當前(qian)源(yuan)文(wen)(wen)件(jian)中(zhong)說明和定義。對(dui)于可在(zai)(zai)當前(qian)源(yuan)文(wen)(wen)件(jian)以外(wai)使用(yong)的函(han)(han)數(shu),應(ying)(ying)該(gai)(gai)在(zai)(zai)一個頭(tou)文(wen)(wen)件(jian)中(zhong)說明,要使用(yong)這些(xie)函(han)(han)數(shu)的源(yuan)文(wen)(wen)件(jian)要包含這個頭(tou)文(wen)(wen)件(jian)
static全局(ju)(ju)變量(liang)與普通的全局(ju)(ju)變量(liang)有什(shen)么區別(bie):static全局(ju)(ju)變量(liang)只(zhi)初使化一(yi)次(ci),防止在其他(ta)文件單元中被引用;
static局(ju)部變(bian)量(liang)(liang)和普(pu)通局(ju)部變(bian)量(liang)(liang)有什么(me)區別(bie):static局(ju)部變(bian)量(liang)(liang)只被(bei)初始化(hua)一次(ci)(ci),下(xia)一次(ci)(ci)依據上一次(ci)(ci)結果值;
static函(han)(han)數(shu)與普通(tong)函(han)(han)數(shu)有什(shen)么區別:static函(han)(han)數(shu)在(zai)內存中(zhong)只(zhi)有一(yi)份,普通(tong)函(han)(han)數(shu)在(zai)每個被調用(yong)中(zhong)維(wei)持一(yi)份拷(kao)貝
程序的(de)局部變量(liang)存在(zai)(zai)于(yu)(棧)中,全(quan)局變量(liang)存在(zai)(zai)于(yu)(靜態(tai)區)中,動態(tai)申請數據(ju)存在(zai)(zai)于(yu)(堆)中。
18、設有以(yi)下說明和定(ding)義:
typedef union {long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
則語句 printf("%d",sizeof(struct date)+sizeof(max));的執行結果是:
答:
16位編(bian)譯器中,union = 5*2 = 10
data = int 2 + 10 + 8 = 20
此時(shi)結果為30
32位(wei)編譯器中:union = 5*4 = 20
Data = int 4+ union 20 + double 8 = 32
此時(shi)結果為52
19、寫出(chu)下(xia)列代碼的(de)輸出(chu)內(nei)容(簡單(dan))
typedef int(FUNC1)(int in); //自定(ding)義(yi)函數(shu)類型,注意要與函數(shu)指針的定(ding)義(yi)形式分開。
typedef int(FUNC2) (int*,int*,int*);
int inc(int a)
{ return(++a); }
int multi(int*a,int*b,int*c)
{ return(*c=*a**b); }
void show(FUNC2 fun, int arg1, int *arg2) //回調函數
{
int temp = arg1;
arg1 = inc(arg1);
fun(&temp,&arg1, arg2);
printf("%d\n",*arg2);
}
main()
{
int a;
show(multi,10,&a);
return 0;
}
答:110
20、下(xia)面的(de)(de)代碼的(de)(de)目(mu)的(de)(de)是把一(yi)個字符串倒序,如(ru)“abcd”倒序后變(bian)為“dcba”,請找出所(suo)有錯誤。
1、#include"string.h"
2、main()
3、{
4、 char*src="hello,world";
5、 char* dest=NULL;
6、 int len=strlen(src);
7、 dest=(char*)malloc(len);
8、 char* d=dest;
9、 char* s=src[len];
10、 while(len--!=0)
11、 d++=s--;
12、 printf("%s",dest);
13、 return 0;
14、}
答:
方法1:
int main(){
char* src = "hello,world";
int len = strlen(src);
char* dest = (char*)malloc(len+1);//要為\0分(fen)配(pei)一個空間(jian)
char* d = dest;
char* s = &src[len-1];//指向最后一個字符
while( len-- != 0 )
*d++=*s--;
*d = 0;//尾(wei)部要加\0
printf("%s\n",dest);
free(dest);// 使用完,應當釋放空間,以免造成(cheng)內(nei)存(cun)泄露
return 0;
}
方法2:
main()
{
char str[]="hello,world";
int len=strlen(str);
char t;
for(int i=0; i{
t=str[i];
str[i]=str[len-i-1]; str[len-i-1]=t;
}
printf("%s",str);
return 0;
}
21.用(yong)兩個(ge)棧實現一個(ge)隊列的功能(neng)?要求給出算法和(he)思路(lu)(思路(lu)題,有用(yong))
設2個棧為A,B, 一開始均為空(kong).
入隊:
將新元(yuan)素(su)push入棧(zhan)A;
出隊:
(1)判斷棧B是否為空;
(2)如果(guo)不(bu)為空(kong),則(ze)將棧B中最(zui)頂元素pop出(chu);如果(guo)為空(kong),則(ze)將A中所有元素POP出(chu)并PUSH到B中,這后POP出(chu)最(zui)頂元素,A則(ze)下移一單位。
2.對于一個頻繁使用(yong)的短小(xiao)函數(shu),在C語言中(zhong)應(ying)用(yong)什么實(shi)現,在C++中(zhong)應(ying)用(yong)什么實(shi)現?
c用(yong)宏定(ding)義,c++用(yong)inline
6.軟件測試(shi)都有那(nei)些(xie)種類?
黑盒:針(zhen)對(dui)系統功能的測(ce)試 白(bai)合:測(ce)試函數功能,各函數接口
7.確定(ding)模塊的(de)功能和模塊的(de)接口是(shi)在軟件設計的(de)那個(ge)隊段(duan)完成的(de)?
概要設計階段
三.選擇題:
1.Ethternet鏈接到Internet用到以下(xia)那(nei)個協議?
A.HDLC; B.ARP; C.UDP; D.TCP; E.ID 選A
2.屬于(yu)網絡層協議的是:
A.TCP;B.IP;C.ICMP;D.X.25 選B
3.Windows消息(xi)調度機制是:
A.指(zhi)令隊(dui)列;B.指(zhi)令堆棧(zhan);C.消息隊(dui)列;D.消息堆棧(zhan); 選C
四(si).找錯題:
2.#define Max_CB 500
void LmiQueryCSmd(Struct MSgCB * pmsg)
{
nsigned char ucCmdNum;
for(ucCmdNum=0;ucCmdNum
{
......;
}
死循環
3.以下是求一個數的(de)平方(fang)的(de)程序(xu),請找出(chu)錯誤:
#define SQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
注(zhu)意(yi):此題(ti)是有(you)歧(qi)義(yi)的(de),屬于(yu)有(you)問題(ti)的(de)代碼,要(yao)盡量避免寫這樣的(de)代碼。因為當一個句子中有(you)多個++操作符時,在不同的(de)編譯(yi)器里,運算順序可能是不一樣的(de),還有(you)可能相互影(ying)響。
上面的代碼中,“b=SQUARE(++a)”語句經預處理(li)后,變(bian)為(wei)b= ((++a)*(++a)),兩次++后a的值變(bian)為(wei)7,故最后的結果是“b = 7*7”,而不是原先設定(ding)的“b = 6*6”。
2.TCP/IP通信建立的過程怎樣,端(duan)口有什么作用?
三(san)次握手(shou),確(que)定(ding)哪個應用程(cheng)序使用該(gai)協(xie)議