話說“金九銀十”,這個時候很多人蠢蠢欲動,在找工作。我做技術面試好多年了,接下來,聊聊這個技術面試的話題。問:MCU開發的C語言中,全局變量和局部變量有什么區別?問題簡單吧,很多小伙伴想都不用想就直接說了,頭頭是道。全局變量是定義在全局區的,可以被不同函數使用;局部變量是定義在函數內部的使用的是棧的資源,只能被這一個函數使用。這是技術面試,面試官的需求是想招一個技術好的,例如知識面廣的,專業有深度的,經驗豐富的人。而應聘者,是想要拿到這個offer,盡量要高點工資等等。各有所需,契合點就在這個面試問題上。面試官想要聽到更有深度更有積累的答案;而應聘者,應該盡可能地展現自己的才能。完美的面試,無非就是面試者從容自信地展示自己豐富的知識技能和項目經驗,盡最大程度地展現自己的優點,而這些優點等正是招聘方很需要的。所以,問題簡單,不能簡單地回答。如果簡單地回答表面上的知識點,并不能說這個人差,但看不出優秀。如何回答面試官的問題,首先你要站在面試官的角度思考下,他想要什么樣的人。也許你說你不知道他想招什么樣的,但是你應該知道一個軟件團隊更應該需要什么樣的人,例如:1. 級別低一點的,可以做設計,寫代碼思路清晰的;2. 稍微經驗多點的,設計有一套方法的,解決bug效率很高的;3. 再高一點,有創新的方法,很夠很大程度提高工作效率,給公司帶來更高效益的。如此等等,技術牛逼,還有一個共同的要求:思維敏捷,思路清晰,善于總結和表達。這個很重要,畢竟是一個團隊干活,溝通匯報就占用很多時間。一個思路清晰,表達能力強的人,工作效率很高的。怎么從這個問題,表達出“清晰有條理,知識積累豐富,技術有深度的效果”呢?1. 從存儲分配來看,mcu一般有ROM(或flash)和RAM存儲空間,代碼和常量數據一般是存放于ROM空間的,而變量等是在RAM空間的;(不要覺得這種回答多余或簡單,好多人分不清ROM和RAM的區別)2. 從數據段來看,這個RAM有很多種用途分類一般有data段,bss段,還有stack和heap等等,其中全局變量一般定義在data或bss段,那data段是存放有初始化值的變量,bss段是存放未初始化或者初始化值為0的變量,而局部變量在stack空間;3. 從初始化階段來看,MCU在啟動的時候,一般在main函數之前,會對RAM空間清零初始化(防止一些MCU的ECC報錯問題),然后就對data段數據進行賦值初始化,具體怎樣一個過程呢,例如greenhills環境的,有個_start的庫函數做這個事情,ARM核芯片使用的Keil或者NXP的S32DS環境的,有專門一個初始化data和bss段函數,而stack空間又分有原始裸機環境的stack和RTOS的stack,在啟動OS之前,局部變量用的是裸機的stack空間,那以后用的是OS的stack;——這一點充分表達了你對MCU啟動的熟悉程度和知識積累4. 從變量的壽命周期和使用范圍看,全局變量從MCU啟動main之后就可以使用,一直可以持續到關機,而局部變量一般存在于一個函數之內,在函數被調用的時候創建,函數退出的時候銷毀,當然靜態局部變量除外,還有些情況是,不同編譯器,有可能局部變量用的是普通寄存器,而不是棧空間;——這一點展現出了你對變量定義比較深入的理解,甚至對變量的調試也很熟悉5. 從使用的注意事項看,全局變量可以被不同函數使用,可以用來傳遞一些信息,特別是傳遞一些buffer數據處理,很方便,而局部變量,只局限于函數內,占用棧空間,不適合定義很大空間,謹防棧溢出的情況,也不能用于異步函數傳數據,特別是傳數組指針等;6. 從架構設計來看,全局變量雖好,共享數據需要注意多線程多任務問題,需要做互斥保護,另外,一個代碼使用過多的全局變量,容易讓代碼耦合性變高,不利于維護,而局部變量雖然局限在函數內部,但獨立性較好,而且在可重入函數設計上比較友好,在架構設計上應當充分考慮各種因素,不能一概而論,有時候靜態變量更有利于模塊化,解決耦合性高的問題,當然要根據實際情況而定。以上的這些回答,不僅思路清晰,有條不紊,同時還展現出應聘者的知識儲備和豐富的經驗積累。如果面試官覺得滿意或對你的回答很感興趣,會順著你回答的幾個點跟你深入探討。這里你就可以引導他跟你聊點你擅長的內容,在面試桌上掌握主動權。試問,能從各個角落展示你的才能的人,哪個面試官不愛呢?如果這個文章能對你有幫助,請點個贊????點個在看,感謝!關注公眾號“嵌入式軟件實戰派”,我給你分享更多面試知識和技巧。如果你喜歡我的文章,請關注,并轉發、點贊和在看,這是對我莫大的鼓勵!
