我們根據以往的學員的面試經歷,為大家整理了一些面試經常會遇到的題目,希望這些干貨對大家面試有所幫助。
一.已知一個數組table,用一個宏定義,求出數據的元素個數
答: #define NTBL (sizeof(tabl
二.一個32位的機器,該機器的指針是多少位?
答:指針是多少位只要看地址總線的位數就行了。80386以后的機子都是32的數據總線。所以指針的位數就是4個字節了。
三.關鍵字const有什么含義?
答:1)只讀。2)使用關鍵字const也許能產生更緊湊的代碼。3)使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。
四.TCP與UDP有啥區別?
答:TCP和UDP是OSI模型中的運輸層中的協議。TCP提供可靠的通信傳輸,而UDP則常被用于廣播和細節控制交給應用的通信傳輸,兩者主要的不同體現在一下幾個方面:
1、TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發送數據之前不需要建立連接
2、TCP提供可靠的服務。它通過校驗和,丟包時的重傳控制,序號標識,滑動窗口、確認應答,次序亂掉的分包進行順序控制實現可靠傳輸。即通過TCP連接傳送的數據,無差錯,不丟失,不重復,且按序到達; UDP盡最大努力交付,即不保證可靠交付。
3、UDP具有較好的實時性,工作效率比TCP高,適用于對高速傳輸和實時性有較高要求的通信或廣播通信場景。
4、每一條TCP連接只能是點到點的; UDP支持一對一,一對多,多對一和多對多的交互通信方式。
5、TCP對系統資源要求較多,UDP對系統資源要求較少。
UDP有時比TCP更有優勢:
UDP以其簡單、傳輸快的優勢,在越來越多場景下取代了TCP, 如實時游戲。
(1)網速的提升給UDP的穩定性提供可靠網絡保障,丟包率很低,如果使用應用層重傳,能夠確保傳輸的可靠性。
(2)TCP為了實現網絡通信的可靠性,使用了復雜的擁塞控制算法,建立了繁瑣的握手過程,由于TCP在內置的系統協議棧中,極難對其進行改進。
采用TCP,一旦發生丟包,TCP會將后續的包緩存起來,等前面的包重傳并接收到后再繼續發送,延時會越來越大。
基于UDP對實時性要求較為嚴格的情況下,采用自定義重傳機制,能夠把丟包產生的延遲降到最低,盡量減少網絡問題造成的影響。
五.請問以下代碼有什么問題:
int main() {
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
答:沒有為str分配內存空間,將會發生異常,問題出在將一個字符串復制進一個字符變量指針所指地址。雖然可以正確輸出結果,但因為越界進行內在讀寫而導致程序崩潰。
e)/sizeof(table[0]))
2.程序的局部變量存在于哪里,全局變量存在于哪里,動態申請數據存在于哪里。
答:程序的局部變量存在于棧區;全局變量存在于靜態區;動態申請數據存在于堆區。
六.寫一個"標準"宏MIN ,這個宏輸入兩個參數并返回較小的一個
答:#define MIN(A,B) ((A) <= (B) ? (A) : (B))
考點:
1) 標識#define在宏中應用的基本知識。這是很重要的。因為在 嵌入(inline)操作符 變為標準C的一部分之前,宏是方便產生嵌入代碼的唯一方法,對于嵌入式系統來說,為了能達到要求的性能,嵌入代碼經常是必須的方法。
2) 三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比if-then-else更優的代碼,了解這個用法是很重要的。
3) 懂得在宏中小心地把參數用括號括起來。
七.引用與指針有什么區別?
答:
1) 引用必須被初始化,指針不必。
2) 引用初始化以后不能被改變,指針可以改變所指的對象。
3) 不存在指向空值的引用,但是存在指向空值的指針。
八.do……while和while有什么區別?
答:前一個循環一遍再判斷,后一個判斷以后再循環。
九.什么是預編譯,何時需要預編譯?
答:
1、總是使用不經常改動的大型代碼體。
2、程序由多個模塊組成,所有模塊都使用一組標準的包含文件和相同的編譯選項。在這種情況下,可以將所有包含文件預編譯為一個預編譯頭。
預編譯指令指示了在程序正式編譯前就由編譯器進行的操作,可以放在程序中的任何位置。
十.產生死鎖的原因是什么?
答:多個并發進程因爭奪系統資源而產生相互等待的現象。即:一組進程中的每個進程都在等待某個事件發生,而只有這組進程中的其他進程才能觸發該事件,這就稱這組進程發生了死鎖。
產生死鎖的本質原因為:
1)、系統資源有限。
2)、進程推進順序不合理。
希望以上整理的面試題能對眾位求職者有所幫助。