說明:所有題目均摘錄於網路以及我所見過的面試題目,歡迎補充!
無特殊說明情況下,下面所有題s目都是linux下的32位c程式。
1、堆和棧有什麼區別?
(1)棧由作業系統分配和釋放;堆則是程式設計師手動去申請釋放;
(2)棧是一塊連續的記憶體區域,也就是棧頂位址和棧的最大容量是系統規定的;堆是不連續的記憶體區域,是因為系統使用鍊錶來儲存空閒記憶體位址。
(3)對於棧,在函式呼叫時,第乙個入棧的是函式呼叫語句的下一條可執行語句的位址,然後是函式引數(一般是從右到左)入棧,最後是區域性變數(靜態變數不入棧)。函式呼叫結束後,區域性變數先出棧,然後是引數。對於堆,一般在堆頭部用乙個位元組存放堆大小,其他內容由程式設計師安排。
2、棧可能是向上生長,也可能是向下生長,試寫一段**,判斷棧生長方向?
解析:我們可以根據區域性變數入棧的特性來判斷,由棧的連續性還有區域性變數入棧的方式,我們可以來判斷棧的生長方向。
bool3、定義乙個巨集,來求結構體中某成員的偏移量stackdownward()
else }
#define offsetof(type, member) ((size_t) &((type *)0)->member )解析:將0轉換為(type *)型別,也就是結構體首位址為0,因此資料成員的偏移量也就是相對於0的偏移量,直接取該成員位址就是所求的偏移量。
4、判斷大小端
可用兩種方法,如下:
bool isbigendian()聯合體union的存放順序是所有成員都從低位址開始存放,利用該特性可以輕鬆地獲得了cpu對記憶體採用little-endian還是big-endian模式讀寫:return
false;
}
bool isbigendian()關於大小端的概念:num;
num.a = 0x1234
;
if( num.b == 0x12
)
return
false;
}
1) little-endian就是低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。
2) big-endian就是高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端。
舉乙個例子,比如數字0x12 34 56 78在記憶體中的表示形式為:
1)大端模式:
低位址 -----------------> 高位址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低位址 ------------------> 高位址
0x78 | 0x56 | 0x34 | 0x12
可見,大端模式和字串的儲存模式類似。
參考:
1、《詳解大端模式和小端模式》
Linux 系統程式設計
1 i o操作 2 檔案和目錄管理 3 記憶體管理 1 建立匿名記憶體對映 2 對映 dev zero檔案 類unix 作業系統中,dev zero是乙個特殊的檔案,當你讀它的時候,它會提供無限的空字元 null,ascii nul,0x00 其中的乙個典型用法是用它提供的字元流來覆蓋資訊,另乙個常...
Linux系統程式設計
1.linux程序 守護程序 脫離終端的後台程序 2.linux程序 殭屍程序 3.linux 下程序通訊 其中setsockopt server sockfd,sol socket,so reuseaddr,on,sizeof on 因為每乙個連線都由本地位址和遠端位址的組合唯一確定,所以只要遠端...
程式設計面試題
1.自定義乙個分頁函式,傳參當前頁數 總頁數,輸出以下 1.34567.10 123456.10 1 showpage是掐頭去尾的顯示數量 2 這個函式的重點就在於起始值和結束值的運算 3function page currentpage,totalpages,showpage 5 412 13 p...