【正文】
{ char*src=hello,world。}main(){int a。fun(amp。typedef int(FUNC2) (int*,int*,int*)。return 0。b=a++。則語句 printf(%d,sizeof(struct date)+sizeof(max))。 DATE cow。 int k[5]。如果你知道答案,或猜出正確答案,做得好。不管你相不相信,上面的例子是完全合乎語法的。在我的經(jīng)驗里,好的嵌入式程序員非常準確地明白硬件的細節(jié)和它的局限,然而PC機程序往往把硬件作為一個無法避免的煩惱。 /*139。這一點對于應(yīng)當頻繁用到無符號數(shù)據(jù)類型的嵌入式系統(tǒng)來說是豐常重要的。}這個問題測試你是否懂得C語言中的整數(shù)自動轉(zhuǎn)換原則,我發(fā)現(xiàn)有些開發(fā)者懂得極少這些東西。第二部分:程序代碼評價或者找錯下面的代碼輸出是什么,為什么?void foo(void){輸入兩個參數(shù),輸出較小的一個:define MIN(A,B) ((A) (B))? (A) : (B))表明1年中有多少秒(忽略閏年問題):define SECONDS_PER_YEAR (60 * 60 * 24 * 365)ULdefine DOUBLE(x) x+x 與 define DOUBLE(x) ((x)+(x))i = 5*DOUBLE(5); i為30 i = 5*DOUBLE(5); i為50已知一個數(shù)組table,用一個宏定義,求出數(shù)據(jù)的元素個數(shù)define NTBLdefine NTBL (sizeof(table)/sizeof(table[0]))4 ,編譯的時候會不會有問題?這兩個static變量會保存到哪里(棧還是堆或者其他的)?答:static的全局變量,表明這個變量僅在本模塊中有意義,不會影響其他模塊。 // An array of 10 pointers to functions that take an integer argument and return an integer解釋局部變量、全局變量和靜態(tài)變量的含義。 // An array of 10 integerse) int *a[10]。3用變量a給出下面的定義答:a) 一個整型數(shù)(An integer)b) 一個指向整型數(shù)的指針(A pointer to an integer)c) 一個指向指針的的指針,它指向的指針是指向一個整型數(shù)(A pointer to a pointer to an integer)d) 一個有10個整型數(shù)的數(shù)組(An array of 10 integers)e) 一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的(An array of 10 pointers to integers)f) 一個指向有10個整型數(shù)數(shù)組的指針(A pointer to an array of 10 integers)g) 一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(A pointer to a function that takes an integer as an argument and returns an integer)h) 一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)( An array of ten pointers to functions that take an integerargument and return an integer )答案是:a) int a。tPS p3,p4。 以上兩種情況的意圖都是要定義dPS 和 tPS 作為一個指向結(jié)構(gòu)s指針。得到正確的答案固然重要,但解決問題的方法和你做決定的基本原理更重要些。 這是一個有趣的問題。elseif ((ptr = (char *)malloc(0)) == NULL) 不用說,如果你能得到后兩點,那么你的被雇用前景越來越光明了。有些處理器/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR中做浮點運算。如果你不懂這個,那么你不會被雇用的。3中斷(Interrupts) 答: 中斷是嵌入式系統(tǒng)中重要的組成部分,這導致了很多編譯開發(fā)商提供一種擴展—讓標準C支持中斷。 *ptr = 0xaa66。 ptr = (int *)0x67a9。 int *ptr。這一問題的實現(xiàn)方式隨著個人風格不同而不同。在某工程中,要求設(shè)置一絕對地址為0x67a9的整型變量的值為0xaa66。} 一些人喜歡為設(shè)置和清除值而定義一個掩碼同時定義一些說明常數(shù),這也是可以接受的。3) 用 defines 和 bit masks 操作。2) 用bit fields。給定一個整型變量a,寫兩段代碼,第一個設(shè)置a的bit 3,第二個清除a 的bit 3?!边@會給我留下一個壞印象。我首選的方案是:while(1){}一些程序員更喜歡如下方案:for(。 a EXP)pointer : if ( a != NULL) or if(a == NULL) 如何判斷一段程序是由C 編譯程序還是由C++編譯程序編譯的?答:ifdef __cpluspluscoutc++。 // 12 字節(jié) cout sizeof(p) endl。注意當數(shù)組作為函數(shù)的參數(shù)進行傳遞時,該數(shù)組自動退化為同類型的指針。 // 注意p 指向常量字符串 p[0] = ‘X’。指針可以隨時指向任意類型的內(nèi)存塊。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產(chǎn)生意料不到的錯誤。動態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活,但問題也最多2請說出const與define 相比,有何優(yōu)點?答:Const作用:定義常量、修飾函數(shù)參數(shù)、修飾函數(shù)返回值三個作用。在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放。原來成員的值就不存在了, 而對于結(jié)構(gòu)的不同成員賦值是互不影響的2描述內(nèi)存分配方式以及它們的區(qū)別?答:1) 從靜態(tài)存儲區(qū)域分配。2結(jié)構(gòu)與聯(lián)合有和區(qū)別?答:(1). 結(jié)構(gòu)和聯(lián)合都是由多個不同的數(shù)據(jù)類型成員組成, 但在任何同一時刻, 聯(lián)合中只存放了一個被選中的成員(所有成員共用一塊地址空間), 而結(jié)構(gòu)的所有成員都存在(不同成員的存放地址不同)。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:long square(volatile int *ptr){int a。a = *ptr。盡管這并不很常見。一個例子是只讀的狀態(tài)寄存器。1). 一個參數(shù)既可以是const還可以是volatile嗎?解釋為什么。我認為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。簡而言之,這樣可以減少bug的出現(xiàn)2關(guān)鍵字volatile有什么含意 并給出三個不同的例子。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多余的信息。第四個意思a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。int * const a。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。在這種情況下,可以將所有包含文件預(yù)編譯為一個預(yù)編譯頭。處理開頭的指令,比如拷貝include包含的文件代碼,define宏定義的替換,條件編譯等,就是為編譯做的預(yù)備工作的階段,主要處理開始的預(yù)編譯指令,預(yù)編譯指令指示了在程序正式編譯前就由編譯器進行的操作,可以放在程序中的任何位置。}對應(yīng)的匯編代碼10:a=c[1]。char *p=1234567890。char *s2=bbbbbbbbbbbbbbbbb。當本次函數(shù)調(diào)用結(jié)束后,局部變量先出棧,然后是參數(shù),最后棧頂指針指向最開始存的地址,也就是主函數(shù)中的下一條指令,程序由該點繼續(xù)運行。堆:是由new分配的內(nèi)存,一般速度比較慢,而且容易產(chǎn)生內(nèi)存碎片,不過用起來最方便.另外,在WINDOWS下,最好的方式是用Virtual Alloc分配內(nèi)存,他不是在堆,也不是在棧,而是直接在進程的地址空間中保留一塊內(nèi)存,雖然用起來最不方便。堆的大小受限于計算機系統(tǒng)中有效的虛擬內(nèi)存。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時,將提示overflow。(2)申請后系統(tǒng)的響應(yīng)棧:只要棧的剩余空間大于所申請空間,系統(tǒng)將為程序提供內(nèi)存,否則將報異常提示棧溢出。例如,聲明在函數(shù)中一個局部變量int b。 //分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。 //全局(靜態(tài))初始化區(qū) char *p3=123456。 char s[]=abc。程序代碼區(qū)—存放函數(shù)體的二進制代碼例子程序這是一個前輩寫的,非常詳細//全局區(qū)(靜態(tài)區(qū))(static)—全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值;static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個被調(diào)用中維持一份拷貝1程序的內(nèi)存分配答:一個由c/C++編譯的程序占用的內(nèi)存分為以下幾個部分棧區(qū)(stack)—由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。static函數(shù)與普通函數(shù)作用域不同。 而靜態(tài)全局變量則限制了其作用域, 即只在定義該變量的源文件內(nèi)有效, 在同一源程序的其它源文件中不能使用它。1statac 全局變量、局部變量、函數(shù)與普通全局變量、局部變量、函數(shù)static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別?static函數(shù)與普通函數(shù)有什么區(qū)別?答 、全局變量(外部變量)的說明之前再冠以static 就構(gòu)成了靜態(tài)的全局變量。1?為什么?答 、可以,在不同的C文件中以static形式來聲明同名全局變量。堆棧溢出一般是由什么原因?qū)е碌???: 冒泡排序算法的時間復(fù)雜度是什么?答 :O(n^2)什么函數(shù)不能聲明為虛函數(shù)?答:constructor1隊列和棧有什么區(qū)別?答:隊列先進先出,棧后進先出1不能做switch()的參數(shù)類型答 :switch的參數(shù)不能為實型。include 與 include 的區(qū)別?答:前者是從Standard 。3) 不存在指向空值的引用,但是存在指向空值的指針。大多數(shù)應(yīng)試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。2). 在模塊內(nèi)(但在函數(shù)體外),一個被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。在C語言中,關(guān)鍵字static有三個明顯的作用:1). 在函數(shù)體,一個被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。那就是,這個函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。2) 引用初始化以后不能被改變,指針可以改變所指的對象。 流操作符和、賦值操作符=的返回值、拷貝構(gòu)造函數(shù)的參數(shù)、賦值操作符=的參數(shù)、其它情況都推薦使用引用.h頭文件中的ifndef/define/endif 的作用?答:防止該頭文件被重復(fù)引用。什么是平衡二叉樹?答 :左右子樹都是平衡二叉樹 且左右子樹的深度差值的絕對值不大于1。對于有些編譯器而言,在同一個函數(shù)內(nèi)可以定義多個同名的局部變量,比如在兩個循環(huán)體內(nèi)都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環(huán)體內(nèi)1如何引用一個已經(jīng)定義過的全局變量?答 、可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變量,假定你將那個變量寫錯了,那么在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連接期間報錯。1do……while和while……do有什么區(qū)別?答 、前一個循環(huán)一遍再判斷,后一個判斷以后再循環(huán)。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態(tài)的全局變量在各個源文件中都是有效的。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域, 限制了它的使用范圍。對于可在當前源文件以外使用的函數(shù),應(yīng)該在一個頭文件中說明,要使用這些函數(shù)的源文件要包含這個頭文件static全局變量與普通的全局變量有什么區(qū)別:static全局變量只初使化一次,防止在其他文件單元中被引用。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。程序結(jié)束后由系統(tǒng)釋放。 { //棧 //123456\0在常量區(qū),p3在棧上。 strcpy(p1,123456)。}解釋堆和棧的區(qū)別答:堆(heap)和棧(stack)的區(qū)別(1)申請方式stack:由系統(tǒng)自動分配。但是注意pp2本身是在棧中的。(3)申請大小的限制棧:在Windows下,棧是向低地址擴展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這是由于系統(tǒng)是用鏈表來存儲的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。但程序員是無法控制的。注意靜態(tài)變量是不入棧的。(6)存取效率的比較char s1[]=aaaaaaaaaaaaaaa。char