昨天分享四道嵌入式 C 語言面試題目,在發完文章後,就有好多網友說後面文章裡面可不可以多搞點面試題目,暫時打算寫個 5 篇左右的嵌入式面試題目,如果确實對各位有很大的幫助,後期再繼續分享。
昨天面試題目答案
1、第一道題目的了解是,假設是在 32 位的系統上,一個記憶體單元就有 4 個位元組,把這四個單元看成一個個放東西的“櫃子”,标号分别為 1 2 3 4,那麼數值 0x12345678,那麼低位元組上的 78 就放到第一個櫃子裡面去,高位元組上的12放到第四個櫃子裡面去,其它按照順序放。
2、第二題目,主要是考察數值溢出問題,這個比較容易發現,細心注意就行。這道題目如果面試官再進一步問的話,如果解決這個溢出問題時,你可以回答在右括号左邊加一個"ul"就行,這個編譯的時候就不報資料溢出警告了。
3、第三道題目,有網友說使用const關鍵字修飾,這個也可以這樣,但是不知道各位網友有沒有老司機在工作當中還有其它更好的辦法來解決這個問題。
4、第四道題目可以使用#pragma pack (n) 來實作,具體想了解這個用法可以參考這篇文章——剖析c語言結構體的進階用法(二)。
今天面試題目分享
1、c語言裡面關鍵static的作用是什麼?(看到這個問題讀者可以自己先思考一下,再看答案)
答案:
(1)、在函數體中,一個被聲明為靜态的變量在這一函數被調用過程中維持其值保持不變。
(2)、在子產品内,子產品就是你寫的".C"檔案(在函數體外),一個被聲明為靜态的變量可以被子產品内所用函數通路,但是不能被子產品外其它函數通路,它相當于一個本地的一個靜态全局變量(注意它和非靜态全局變量的差別哦)。
(3)、在子產品内,一個被聲明為靜态的函數隻可被這一子產品内的其它函數調用。也就是說,這個函數被限制在聲明它的子產品本地内使用,不可以在子產品外使用。
2、寫一個“标準”宏,這個宏輸入兩個參數并傳回較小的一個;同時講出 # 與 ##的作用差別?
答案:
(1)、第一個問題可以這樣來寫,注意裡面使用了三目運算符:
#define MIN(x,y) ((x)
(2)、"#"作用是把宏參數轉化為字元串的運算符,而"##"是把兩個宏參數連接配接的運算符:
#define STR(arg) #arg
這裡當參數 arg 為 hello ,則宏展開的結果是"hello"
#define STR(arg) name_y
#define STR(arg) name_##y
#define STR(arg,arg2) arg arg2##_##arg2##_arg2
上面示例中,假設 arg 為 int , arg2 為 a ,則上面宏展開的結果為:
name_y
name_int
inta_a_a
3、C語言裡面關鍵字sizeof的作用是什麼?
答案:
(1)sizeof是在編譯階段處理,且不能被編譯為機器碼。還有一點,很多人會認為它是一個庫函數;它的作用是計算出各種類型變量或者結構所占的位元組數:
int a ,sizeof(a)
int *a,sizeof(a)
int a[10],sizeof(a)
int a[0],sizeof(a)
sizeof(void)
sizeof(void *)
上面示範結果:
4
4
40
0
1
4
4、請簡述使用者空間的記憶體配置設定及各空間儲存的資料類型:
答案:
(1) 使用者空間供為3G,分為:棧空間,堆空間,資料區,代碼段。
- 棧空間儲存:局部變量,函數形參,自動變量。棧空間特點,先進後出,空間由系統管理;棧空間生命周期所在函數執行結束後釋放;棧空間儲存的局部變量未初始化時,預設初始化為随機值。
- 堆空間:由malloc , calloc ,ralloc,這些好函數配置設定的空間位堆空間,堆空間特點:先進先出,由使用者管理。
- 資料區:又分為.bss段、.data段、常量區。其中.bss段儲存的是未初始化的全局變量,當全局變量未初始化時,系統預設初始化為0;常量區儲存的是常量,裡面儲存的值不能被修改,隻能做讀操作;.data段是儲存已經初始化的全局變量以及被static修飾的變量(靜态變量)。資料區的聲明周期是整個程式執行完之後再釋放。
- 代碼段儲存的是代碼。
總結
今天的分享就到這裡了,希望對你有幫助,上面如有錯誤可以在下方留言交流或者私聊作者都可以。