A. c語言指針面試常見問題
c語言指針面試常見問題
指針的使用,一直是c語言面試題中必考的部分,因為指針本身使用的復雜性與普適性,所以考點非常多,而且也可以與其他知識相互結合,因此我們將會使用五篇專題的篇幅來介紹指針。
分析下面的程序,指出程序中的錯誤:
本題解析
沒有正確為str分配內存空間,將會發生異常。問題出在將一個字元串復制進一個字元變數指針所指地址。雖然編譯的時候沒有報錯,但是在運行過程中,因為越界訪問了未被分配的內存,而導致段錯誤。
相關知識點
在處理與指針相關的問題時,首先需要搞明白的就是內存,因為指針操作的就是內存。
第一個,就是內存的分區。這也是經常會被考察的一個考點。
寫出內存分為幾大區域
對於這個問題,有幾種不同的說法,有的說內存分為五大分區,有的說分為四大分區,我們先來看五大分區的說法:
認為內存分為五大分區的人,通常會這樣劃分:
1、BSS段( bss segment )
通常是指用來存放程序中未初始化的'全局變數和靜態變數 (這里注意一個問題:一般的書上都會說全局變數和靜態變數是會自動初始化的,那麼哪來的未初始化的變數呢?變數的初始化可以分為顯示初始化和隱式初始化,全局變數和靜態變數如果程序員自己不初始化的話的確也會被初始化,那就是不管什麼類型都初始化為0,這種沒有顯示初始化的就 是我們這里所說的未初始化。既然都是0那麼就沒必要把每個0都存儲起來,從而節省磁碟空間,這是BSS的主要作用)的一塊內存區域。BSS是英文Block Started by Symbol的簡稱。BSS段屬於靜態內存分配。 BSS節不包含任何數據,只是簡單的維護開始和結束的地址,即總大小。以便內存區能在運行時分配並被有效地清零。BSS節在應用程序的二進制映象文件中並不存在,即不佔用 磁碟空間 而只在運行的時候佔用內存空間 ,所以如果全局變數和靜態變數未初始化那麼其可執行文件要小很多。
2、數據段(data segment)
通常是指用來存放程序中已經初始化的全局變數和靜態變數的一塊內存區域。數據段屬於靜態內存分配,可以分為只讀數據段和讀寫數據段。字元串常量等,但一般都是放在只讀數據段中。
3、代碼段(code segment/text segment)
通常是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行前就已經確定,並且內存區域通常屬於只讀, 某些架構也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數變數,例如字元串常量等,但一般都是放在只讀數據段中 。
4、堆(heap)
堆是用於存放進程運行中被動態分配的內存段,它的大小並不固定,可動態擴張或 縮減。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張); 當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)
5、棧 (stack)
棧又稱堆棧, 是用戶存放程序臨時創建的局部變數,也就是說我們函數括弧「{}」 中定義的變數(但不包括static聲明的變數,static意味著在數據段中存放變 量)。除此以外, 在函數被調用時,其參數也會被壓入發起調用的進程棧中,並且待到調用結束後,函數的返回值 也會被存放回棧中。由於棧的先進先出特點,所以 棧特別方便用來保存/恢復調用現場。從這個意義上講,我們可以把堆棧看成一個寄存、交換臨時數據的內存區。
而四大分區的說法,則這么認為:
1、堆區:
由程序員手動申請,手動釋放,若不手動釋放,程序結束後由系統回收,生命周期是整個程序運行期間。使用malloc或者new進行堆的申請,堆的總大小為機器的虛擬內存的大小。
說明:new操作符本質上是使用了malloc進行內存的申請,new和malloc的區別如下:
(1)malloc是C語言中的函數,而new是C++中的操作符。
(2)malloc申請之後返回的類型是void*,而new返回的指針帶有類型。
(3)malloc只負責內存的分配而不會調用類的構造函數,而new不僅會分配內存,而且會自動調用類的構造函數。
2、棧區:
由系統進行內存的管理。主要存放函數的參數以及局部變數。在函數完成執行,系統自行釋放棧區內存,不需要用戶管理。整個程序的棧區的大小可以在編譯器中由用戶自行設定,VS中默認的棧區大小為1M,可通過VS手動更改棧的大小。64bits的Linux默認棧大小為10MB,可通過ulimit -s臨時修改。
3、靜態存儲區:
靜態存儲區內的變數在程序編譯階段已經分配好內存空間並初始化。這塊內存在程序的整個運行期間都存在,它主要存放靜態變數、全局變數和常量。
注意:
(1)這里不區分初始化和未初始化的數據區,是因為靜態存儲區內的變數若不顯示初始化,則編譯器會自動以默認的方式進行初始化,即靜態存儲區內不存在未初始化的變數。
(2)靜態存儲區內的常量分為常變數和字元串常量,一經初始化,不可修改。靜態存儲內的常變數是全局變數,與局部常變數不同,區別在於局部常變數存放於棧,實際可間接通過指針或者引用進行修改,而全局常變數存放於靜態常量區則不可以間接修改。
(3)字元串常量存儲在靜態存儲區的常量區,字元串常量的名稱即為它本身,屬於常變數。
(4)數據區的具體劃分,有利於我們對於變數類型的理解。不同類型的變數存放的區域不同。後面將以實例代碼說明這四種數據區中具體對應的變數。
4、代碼區:
存放程序體的二進制代碼。比如我們寫的函數,都是在代碼區的。
通過上面的不同說法,我們也可以看出,這兩種說法本身沒有優劣之分,具體的內存劃分也跟編譯器有很大的關系,因此這兩種說法都是可以接受的,搞明白內存的分區之後,指針的使用才能夠更加的靈活。
;B. 計算機程序c語言面試常見問題
計算機程序c語言面試常見問題
c語言作為計算機程序設計語言,是考察軟體工程師應聘者技術能力的關鍵。計算機程序c語言面試常見問題,我們來看看。
c語言 面試題 精選(筆試)
單選題部分
1、C語言程序的基本單位是____
A.語句
B.函數
C.程序行
D.字元
答案:B
2、C語言程序由()組成
A.子程序
B.過程
C.函數
D.主程序段程序
答案:C
3、演算法的表示方法有______
A.自然語言,傳統流程圖,N-S流程圖,偽代碼,計算機語言
B.高級語言,匯編語言,機器語言
C.C語言,QBASIC語言,InterDev
D.圖形圖像法,描述法,編程法
E.計算機語言
答案:A
4、下列變數定義中合法的是
A.short_a=1-.le-1;
B.doubleb=1+5e2.5;
C.longdo=0xfdaL;
D.float2_and=1-e-3;
答案:A
5、下面說法中正確的是()
A.int型和long型運算先將int型轉換成unsigned型,再轉換
B.兩個float型運算結果為double型
C.只要表達式中存在double型,所有其他類型數據都必須轉
D.表達式中的'類型轉換與運算順序有關
答案:C
6、以下不正確的敘述是
A.在C程序中,逗號運算符的優先順序最低
B.在C程序中,APH和aph是兩個不同的變數
C.若a和b類型相同,在計算了賦值表達式a=b後b中的值將放入a中,而b中的值不變
D.當從鍵盤輸入數據時,對於整型變數只能輸入整型數值,對於實型變數只能輸入實型數值
答案:D
7、以下說法中正確的是
A.#define和printf都是C語句
B.#define是C語句,而printf不是
C.printf是C語句,但#define不是
D.#define和printf都不是C語句
答案:D
8、若有條件表達式(exp)?a++:b–,則以下表達式中能完全等價於表達式(exp)的是
A.(exp==0
B.(exp!=0)
C.(exp==1)
D.(exp!=1)
答案:B
9、若有說明:inta[3][4]={0};則下面正確的敘述是
A.只有元素a[0][0]可得到初值0
B.此說明語句不正確
C.數組a中各元素都可得到初值,但其值不一定為0
D.數組a中每個元素均可得到初值0
答案:D
c語言面試問答題
1、局部變數能否和全局變數重名?
答:能,局部會屏蔽全局。要用全局變數,需要使用"::"
局部變數可以與全局變數同名,在函數內引用這個變數時,會用到同名的局部變數,而不會用到全局變數。對於有些編譯器而言,在同一個函數內可以定義多個同名的局部變數,比如在兩個循環體內都定義一個同名的局部變數,而那個局部變數的作用域就在那個循環體內。
2、如何引用一個已經定義過的全局變數?
答:extern
可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個變寫錯了,那麼在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在連接期間報錯
3、全局變數可不可以定義在可被多個.C文件包含的頭文件中?為什麼?
答:可以,在不同的C文件中以static形式來聲明同名全局變數。
可以在不同的C文件中聲明同名的全局變數,前提是其中只能有一個C文件中對此變數賦初值,此時連接不會出錯。
;C. 剛出爐的網易Linux運維面試題(附帶答案)
1、Linux系統中,用戶文件描述符0表示 ()。
2、Linux系統中某個可執行文件屬於root並且有suid許可權,當一個普通用戶lutixia運行這個程序時,產生的進程的有效用戶和實際用戶分別是?()
3、以下哪些命令可以列印文件(access.log)中包含chrome的行到標准輸出()
4、運行在多核處理器上的Linux環境中,若臨界區非常短,且不允許線程上下文切換的情況下,使用下列哪種機制滿足上述需求並且性能最好?()
5、具有很多C語言的功能,又稱過濾器的是?()
6、在OSI模型中,HTTP協議工作在第()層,交換機工作在第()層。
7、如何獲取上一條命令執行的返回碼?()
8、下列關於網路編程的描述中,錯誤的是?()
9、當前目錄下有a和b兩個文件,執行命令「ls>c」,請問文件c裡面的內容是什麼?()
10、下面那些命令可以用來查看Linux主機的默認路由()
11、下面的內存管理模式中,會產生外零頭的是()
12、vsftpd服務流量控制的參數()
13、進程之間通信都有哪些方式?()
14、在Linux上,對於多進程,子進程繼承了父進程的下列哪些?()
15、關於Linux系統的負載情況,以下表述正確的是()。
歡迎 點贊 , 收藏 ,你的喜歡就是我原創的動力,運維面試,筆試題系列將會持續更新,希望對你找工作有幫助!
D. c語言常見面試題
C語言面試常見問題
預處理器(Preprocessor)
1 . 用預處理指令#define 聲明一個常數,用以表明1年中有多少秒(忽略閏年問題)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在這想看到幾件事情:
1) #define 語法的基本知識(例如:不能以分號結束,括弧的使用,等等)
2)懂得預處理器將為你計算常數表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。
3) 意識到這個表達式將使一個16位機的整型數溢出-因此要用到長整型符號L,告訴編譯器這個常數是的長整型數。
4) 如果你在你的表達式中用到UL(表示無符號長整型),那麼你有了一個好的起點。記住,第一印象很重要。
2 . 寫一個"標准"宏MIN ,這個宏輸入兩個參數並返回較小的一個。
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
這個測試是為下面的目的而設的:
1) 標識#define在宏中應用的基本知識。這是很重要的。因為在 嵌入(inline)操作符 變為標准C的一部分之前,宏是方便產生嵌入代碼的唯一方法,對於嵌入式系統來說,為了能達到要求的性能,嵌入代碼經常是必須的方法。
2)三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比if-then-else更優化的代碼,了解這個用法是很重要的。
3) 懂得在宏中小心地把參數用括弧括起來
4) 我也用這個問題開始討論宏的副作用,例如:當你寫下面的代碼時會發生什麼事?
least = MIN(*p++, b);
3. 預處理器標識#error的目的是什麼?
如果你不知道答案,請看參考文獻1。這問題對區分一個正常的伙計和一個書獃子是很有用的。只有書獃子才會讀C語言課本的附錄去找出象這種問題的答案。當然如果你不是在找一個書獃子,那麼應試者最好希望自己不要知道答案。
死循環(Infinite loops)
4. 嵌入式系統中經常要用到無限循環,你怎麼樣用C編寫死循環呢?
這個問題用幾個解決方案。我首選的方案是:
while(1)
{
}
一些程序員更喜歡如下方案:
for(;;)
{
}
這個實現方式讓我為難,因為這個語法沒有確切表達到底怎麼回事。如果一個應試者給出這個作為方案,我將用這個作為一個機會去探究他們這樣做的基本原理。如果他們的基本答案是:"我被教著這樣做,但從沒有想到過為什麼。"這會給我留下一個壞印象。
第三個方案是用 goto
Loop:
...
goto Loop;
應試者如給出上面的方案,這說明或者他是一個匯編語言程序員(這也許是好事)或者他是一個想進入新領域的BASIC/FORTRAN程序員。
數據聲明(Data declarations)
5. 用變數a給出下面的定義
a) 一個整型數(An integer)
b)一個指向整型數的指針( A pointer to an integer)
c)一個指向指針的的指針,它指向的指針是指向一個整型數( A pointer to a pointer to an intege)r
d)一個有10個整型數的數組( An array of 10 integers)
e) 一個有10個指針的數組,該指針是指向一個整型數的。(An array of 10 pointers to integers)
f) 一個指向有10個整型數數組的指針( A pointer to an array of 10 integers)
g) 一個指向函數的指針,該函數有一個整型參數並返回一個整型數(A pointer to a function that takes an integer as an argument and returns an integer)
h) 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數( An array of ten pointers to functions that take an integer argument and return an integer )
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
人們經常聲稱這里有幾個問題是那種要翻一下書才能回答的問題,我同意這種說法。當我寫這篇文章時,為了確定語法的正確性,我的確查了一下書。但是當我被面試的時候,我期望被問到這個問題(或者相近的問題)。因為在被面試的這段時間里,我確定我知道這個問題的答案。應試者如果不知道所有的答案(或至少大部分答案),那麼也就沒有為這次面試做准備,如果該面試者沒有為這次面試做准備,那麼他又能為什麼出准備呢?
Static
6. 關鍵字static的作用是什麼?
這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明顯的作用:
1)在函數體,一個被聲明為靜態的變數在這一函數被調用過程中維持其值不變。
2) 在模塊內(但在函數體外),一個被聲明為靜態的變數可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變數。
3) 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。
大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然不懂得本地化數據和代碼范圍的好處和重要性。
Const
7.關鍵字const有什麼含意?
我只要一聽到被面試者說:"const意味著常數",我就知道我正在和一個業余者打交道。去年Dan Saks已經在他的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應該非常熟悉const能做什麼和不能做什麼.如果你從沒有讀到那篇文章,只要能說出const意味著"只讀"就可以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)
如果應試者能正確回答這個問題,我將問他一個附加的問題:
下面的聲明都是什麼意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
/******/
前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整型數是可以修改的,但指針是不可修改的)。最後一個意味著a是一個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改的,同時指針也是不可修改的)。如果應試者能正確回答這些問題,那麼他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字 const,也還是能很容易寫出功能正確的程序,那麼我為什麼還要如此看重關鍵字const呢?我也如下的幾下理由:
1) 關鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數為常量是為了告訴了用戶這個參數的應用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這點多餘的信息。(當然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。)
2) 通過給優化器一些附加的信息,使用關鍵字const也許能產生更緊湊的代碼。
3) 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。
Volatile
8. 關鍵字volatile有什麼含意?並給出三個不同的例子。
一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用保存在寄存器里的備份。下面是volatile變數的幾個例子:
1) 並行設備的硬體寄存器(如:狀態寄存器)
2) 一個中斷服務子程序中會訪問到的非自動變數(Non-automatic variables)
3) 多線程應用中被幾個任務共享的變數
回答不出這個問題的人是不會被僱傭的。我認為這是區分C程序員和嵌入式系統程序員的最基本的問題。搞嵌入式的傢伙們經常同硬體、中斷、RTOS等等打交道,所有這些都要求用到volatile變數。不懂得volatile的內容將會帶來災難。
假設被面試者正確地回答了這是問題(嗯,懷疑是否會是這樣),我將稍微深究一下,看一下這傢伙是不是直正懂得volatile完全的重要性。
1)一個參數既可以是const還可以是volatile嗎?解釋為什麼。
2); 一個指針可以是volatile 嗎?解釋為什麼。
3); 下面的函數有什麼錯誤:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
下面是答案:
1)是的。一個例子是只讀的狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。
2); 是的。盡管這並不很常見。一個例子是當一個中服務子程序修該一個指向一個buffer的指針時。
3) 這段代碼有點變態。這段代碼的目的是用來返指針*ptr指向值的平方,但是,由於*ptr指向一個volatile型參數,編譯器將產生類似下面的代碼:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}
由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}
位操作(Bit manipulation)
9. 嵌入式系統總是要用戶對變數或寄存器進行位操作。給定一個整型變數a,寫兩段代碼,第一個設置a的bit 3,第二個清除a 的bit 3。在以上兩個操作中,要保持其它位不變。
對這個問題有三種基本的反應
1)不知道如何下手。該被面者從沒做過任何嵌入式系統的工作。
2) 用bit fields。Bit fields是被扔到C語言死角的東西,它保證你的代碼在不同編譯器之間是不可移植的,同時也保證了的你的代碼是不可重用的。我最近不幸看到 Infineon為其較復雜的通信晶元寫的驅動程序,它用到了bit fields因此完全對我無用,因為我的編譯器用其它的方式來實現bit fields的。從道德講:永遠不要讓一個非嵌入式的傢伙粘實際硬體的邊。
3) 用 #defines 和 bit masks 操作。這是一個有極高可移植性的方法,是應該被用到的方法。最佳的解決方案如下:
#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
一些人喜歡為設置和清除值而定義一個掩碼同時定義一些說明常數,這也是可以接受的。我希望看到幾個要點:說明常數、|=和&=~操作。
訪問固定的內存位置(Accessing fixed memory locations)
10. 嵌入式系統經常具有要求程序員去訪問某特定的內存位置的特點。在某工程中,要求設置一絕對地址為0x67a9的整型變數的值為0xaa66。編譯器是一個純粹的ANSI編譯器。寫代碼去完成這一任務。
這一問題測試你是否知道為了訪問一絕對地址把一個整型數強制轉換(typecast)為一指針是合法的。這一問題的實現方式隨著個人風格不同而不同。典型的類似代碼如下:
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;
A more obscure approach is:
一個較晦澀的方法是:
*(int * const)(0x67a9) = 0xaa55;
即使你的品味更接近第二種方案,但我建議你在面試時使用第一種方案。
中斷(Interrupts)
11. 中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴展—讓標准C支持中斷。具代表事實是,產生了一個新的關鍵字 __interrupt。下面的代碼就使用了__interrupt關鍵字去定義了一個中斷服務子程序(ISR),請評論一下這段代碼的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
這個函數有太多的錯誤了,以至讓人不知從何說起了:
1)ISR 不能返回一個值。如果你不懂這個,那麼你不會被僱用的。
2) ISR 不能傳遞參數。如果你沒有看到這一點,你被僱用的機會等同第一項。
3) 在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理器/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR中做浮點運算。此外,ISR應該是短而有效率的,在ISR中做浮點運算是不明智的。
4) 與第三點一脈相承,printf()經常有重入和性能上的問題。如果你丟掉了第三和第四點,我不會太為難你的。不用說,如果你能得到後兩點,那麼你的被僱用前景越來越光明了。
代碼例子(Code examples)
12 . 下面的代碼輸出是什麼,為什麼?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts("<= 6");
}
這個問題測試你是否懂得C語言中的整數自動轉換原則,我發現有些開發者懂得極少這些東西。不管如何,這無符號整型問題的答案是輸出是 ">6"。原因是當表達式中存在有符號類型和無符號類型時所有的操作數都自動轉換為無符號類型。因此-20變成了一個非常大的正整數,所以該表達式計算出的結果大於6。這一點對於應當頻繁用到無符號數據類型的嵌入式系統來說是豐常重要的。如果你答錯了這個問題,你也就到了得不到這份工作的邊緣。
13. 評價下面的代碼片斷:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1's complement of zero */
對於一個int型不是16位的處理器為說,上面的代碼是不正確的。應編寫如下:
unsigned int compzero = ~0;
這一問題真正能揭露出應試者是否懂得處理器字長的重要性。在我的經驗里,好的嵌入式程序員非常准確地明白硬體的細節和它的局限,然而PC機程序往往把硬體作為一個無法避免的煩惱。
到了這個階段,應試者或者完全垂頭喪氣了或者信心滿滿志在必得。如果顯然應試者不是很好,那麼這個測試就在這里結束了。但如果顯然應試者做得不錯,那麼我就扔出下面的追加問題,這些問題是比較難的,我想僅僅非常優秀的應試者能做得不錯。提出這些問題,我希望更多看到應試者應付問題的方法,而不是答案。不管如何,你就當是這個娛樂吧...
動態內存分配(Dynamic memory allocation)
14. 盡管不像非嵌入式計算機那麼常見,嵌入式系統還是有從堆(heap)中動態分配內存的過程的。那麼嵌入式系統中,動態分配內存可能發生的問題是什麼?
這里,我期望應試者能提到內存碎片,碎片收集的問題,變數的持行時間等等。這個主題已經在ESP雜志中被廣泛地討論過了(主要是 P.J. Plauger, 他的解釋遠遠超過我這里能提到的任何解釋),所有回過頭看一下這些雜志吧!讓應試者進入一種虛假的安全感覺後,我拿出這么一個小節目:
下面的代碼片段的輸出是什麼,為什麼?
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
這是一個有趣的問題。最近在我的一個同事不經意把0值傳給了函數malloc,得到了一個合法的指針之後,我才想到這個問題。這就是上面的代碼,該代碼的輸出是"Got a valid pointer"。我用這個來開始討論這樣的一問題,看看被面試者是否想到庫常式這樣做是正確。得到正確的答案固然重要,但解決問題的方法和你做決定的基本原理更重要些。
Typedef
15 Typedef 在C語言中頻繁用以聲明一個已經存在的數據類型的同義字。也可以用預處理器做類似的事。例如,思考一下下面的例子:
#define dPS struct s *
typedef struct s * tPS;
以上兩種情況的意圖都是要定義dPS 和 tPS 作為一個指向結構s指針。哪種方法更好呢?(如果有的話)為什麼?
這是一個非常微妙的問題,任何人答對這個問題(正當的原因)是應當被恭喜的。答案是:typedef更好。思考下面的例子:
dPS p1,p2;
tPS p3,p4;
第一個擴展為
struct s * p1, p2;
.
上面的代碼定義p1為一個指向結構的指,p2為一個實際的結構,這也許不是你想要的。第二個例子正確地定義了p3 和p4 兩個指針。
晦澀的語法
16 . C語言同意一些令人震驚的結構,下面的結構是合法的嗎,如果是它做些什麼?
int a = 5, b = 7, c;
c = a+++b;
這個問題將做為這個測驗的一個愉快的結尾。不管你相不相信,上面的例子是完全合乎語法的。問題是編譯器如何處理它?水平不高的編譯作者實際上會爭論這個問題,根據最處理原則,編譯器應當能處理盡可能所有合法的用法。因此,上面的代碼被處理成:
c = a++ + b;
因此, 這段代碼持行後a = 6, b = 7, c = 12。
如果你知道答案,或猜出正確答案,做得好。如果你不知道答案,我也不把這個當作問題。我發現這個問題的最大好處是這是一個關於代碼編寫風格,代碼的可讀性,代碼的可修改性的好的話題。
E. linux認證的面試題及答案
linux認證的面試題及答案
Linux認證指獲得專業Linux培訓後通過考試得到的資格。國際上廣泛承認的Linux認證有LinuxProfessionalInstitute(簡稱為LPI)、SairLinux和GNU、Linux+和RedHatCertifiedEngineer。不過,想要考取這個伏絕敏證缺枝書也不是容易的事情,本次我我大家帶來了linux認證面試題及答案希望能夠幫助道大家。
一、填空題:
1. 在Linux系統中,以 文件 方式訪問設備 。
2. Linux內核引導時,從文件 /etc/fstab 中讀取要載入的文件系統。
3. Linux文件系統中每個文件用 i節點 來標識。
4. 全部磁碟塊由四個部分組成,分別為引導塊 、專用塊 、 i節點表塊 和數據存儲塊。
5. 鏈接分為: 硬鏈接 和 符號鏈接 。
6. 超級塊包含了i節點表 和 空閑塊表 等重要的文件系統信息。
7. 某文件的許可權為:drw-r--r--,用數值形式表示該許可權,則該八進制數為: 644 ,該文件屬性是 目錄 。
8. 前台起動的進程使用 Ctrl+c 終止。
9. 靜態路由設定後,若網路拓撲結構發生變化,需由系統管理員修改路由的設置。
10. 網路管理的重要任務是: 控制 和 監控 。
11. 安裝Linux系統對硬碟分區時,必須有兩種分區類型: 文件系統分區 和 交換分區 。
13. 編寫的Shell程序運行前必須賦予該腳本文件 執行 許可權。
14. 系統管理的任務之一是能夠在 分布式 環境中實現對程序和數據的安全保護、備份、恢復和更新。
15. 系統交換分區是作為系統 虛擬存儲器 的一塊區域。
16. 內核分為 進宏余程管理系統 、 內存管理系統 、 I/O管理系統 和文件管理系統 等四個子系統。
17. 內核配置是系統管理員在改變系統配置 硬體 時要進行的重要操作。
18. 在安裝Linux系統中,使用netconfig程序對網路進行配置,該安裝程序會一步步提示用戶輸入主機名、域名、域名伺服器、IP地址、 網關地址 和
子網掩碼 等必要信息。
19. 唯一標識每一個用戶的是用戶 ID 和用戶名。
20 . RIP 協議是最為普遍的一種內部協議,一般稱為動態路由選擇協議。
21. 在Linux系統中所有內容都被表示為文件,組織文件的各種方法稱為 文件系統 。
22. DHCP可以實現動態 IP 地址分配。
23. 系統網路管理員的管理對象是伺服器、 用戶 和伺服器的進程 以及系統的各種資源。
24. 網路管理通常由監測、傳輸和管理三部分組成,其中管理部分是整個網路管理的中心。
25. 當想刪除本系統用不上的 設備驅動程序 時必須編譯內核,當內核不支持系統上的 設備驅動程序 時,必須對內核 升級 。
26 Ping命令可以測試網路中本機系統是否能到達 一台遠程主機 ,所以常常用於測試網路的 連通性 。
27. vi編輯器具有兩種工作模式: 命令模式 和 輸入模式 。
28. 可以用ls –al命令來觀察文件的許可權,每個文件的許可權都用10位表示,並分為四段,其中第一段占 1 位,表示 文件類型 ,第二段佔3位,表示 文
件所有者 對該文件的許可權。
29. 進程與程序的區別在於其動態性,動態的產生和終止,從產生到終止進程可以具有的基本狀態為: 運行態 、 就緒態 和 等待態(阻塞態) 。
30. DNS實際上是分布在internet上的主機信息的資料庫,其作用是實現 IP地址和主機名 之間的轉換。
31. Apache是實現WWW伺服器功能的應用程序,即通常所說的「瀏覽web伺服器」,在伺服器端 為用戶提供瀏覽 web服務 的就是apache應用程序。
32. 在Linux系統上做備份可以有兩種類型:系統備份 和 用戶備份 。其中前者是指對 操作系統 的備份,後者是指對 應用程序和用戶文件的備份。
33. CD-ROM標準的文件系統類型是 iso9660 。
34. 當lilo.conf配置完畢後,使之生效,應運行的命令及參數是 lilo 。
35. 在使用ls命令時,用八進制形式顯示非列印字元應使用參數 -b 。
36. Linux使用支持Windows 9.x/2000長文件名的文件系統的類型是 vfat 。
37. 設定限制用戶使用磁碟空間的命令是 quota 。
38 在Linux系統中,用來存放系統所需要的配置文件和子目錄的目錄是 /etc 。
39. 硬連接只能建立對 文件 鏈接。符號鏈接可以跨不同文件系統創建。
40. 套接字文件的屬性位是 s 。
41. 結束後台進程的命令是 kill 。
42. 進程的運行有兩種方式,即 獨立運行和使用父進程運行 。
43. Links分為 硬鏈接和符號鏈接 。
44. 在超級用戶下顯示Linux系統中正在運行的全部進程,應使用的命令及參數是 ps -aux 。
45. 管道文件的屬性位是 p 。
46. 將前一個命令的標准輸出作為後一個命令的標准輸入,稱之為 管道 。
47. 為腳本程序指定執行權的命令及參數是 chmod a+x filename 。
48. 進行遠程登錄的命令是 telnet 。
49. 欲發送10個分組報文測試與主機abc.tuu.e.cn的連通性,應使用的命令和參數是: ping abc.tuu.e.cn –c 10 。
50. DNS伺服器的進程命名為named,當其啟動時,自動裝載 /etc目錄下的 named.conf 文件中定義的DNS分區資料庫文件。
51. Apache伺服器進程配置文件是 httpd.conf 。
52.在 Linux系統中,壓縮文件後生成後綴為.gz文件的命令是 gzip 。
53. 在用vi編輯文件時,將文件內容存入test.txt文件中,應在命令模式下鍵入 :w test.txt 。
54 可以在標准輸出上顯示整年日歷的命令及參數是 cal -y 。
55. 在shell編程時,使用方括弧表示測試條件的規則是:方括弧兩邊必須有 空格 。
56. 檢查已安裝的文件系統/dev/had5是否正常,若檢查有錯,則自動修復,其命令及參數是 fsck –a /dev/had5 。
57. 在Windows9.x環境下共享Unix/Linux中的用戶目錄的一個工具是 Samba伺服器 。
58. 系統管理員的職責是進行系統資源管理、系統性能管理、設備管理、安全管理和 系統性能監測 。
59 在Linux系統中,測試DNS伺服器是否能夠正確解析域名的的客戶端命令,使用命令 nslookup 。
60. 在Linux系統下,第二個IDE通道的硬碟(從盤)被標識為 hdb 。
61. 當系統管理員需升級內核版本和改變系統硬體配置時,應 重新編譯內核 。
62. 如果只是要修改系統的IP地址,應修改 /etc/rc.d/rc.inet1 配置文件。
63. 當LAN內沒有條件建立DNS伺服器,但又想讓區域網內的用戶可以使用計算機名互相訪問時,應配置 /etc/hosts 文件。
64. 在vi編輯環境下,使用 Esc鍵 進行模式轉換。
65. Slackware Linux 9.0通常使用 ext3 文件系統,系統的全部磁碟塊由 四 部分組成。
66. 將/home/stud1/wang目錄做歸檔壓縮,壓縮後生成wang.tar.gz文件,並將此文件保存到/home目錄下,實現此任務的tar命令格式 tar zcvf
/home/wang.tar.gz /home/stud1/wang 。
67. 管道就是將前一個命令的 標准輸出 作為後一個命令的 標准輸入 。
68. 在使用手工的方法配置網路時,可通過修改 /etc/HOSTNAME 文件來改變主機名,若要配置該計算機的域名解析客戶端,需配置 /etc/resolv.conf
文件。
69. 啟動進程有手動啟動和調度啟動兩種方法,其中調度啟動常用的命令為 at 、 batch 和 crontab 。
70. test.bns.com.cn的域名是 bns.com.cn ,如果要配置一域名伺服器,應在 named.conf 文件中定義DNS資料庫的工作目錄。
71. Sendmail郵件系統使用的兩個主要協議是: SMTP 和 POP ,前者用來發送郵件,後者用來接收郵件。
72. DHCP是動態主機配置協議的簡稱,其作用是:為網路中的主機分配IP地址 。
73. 目前代理伺服器使用的軟體包有很多種,教材中使用的是 squid 。
74. rm命令可刪除文件或目錄,其主要差別就是是否使用遞歸開關 -r或-R 。
75. mv 命令可以移動文件和目錄,還可以為文件和目錄重新命名。
76. 路由選擇協議(RIP)的跳數表示到達目的地之前必須通過的 網關 數,RIP接受的最長距離是 15跳 。
77. ping命令用於測試網路的連通性,ping命令通過 ICMP 協議來實現。
78. nfs 協議用於實現Unix(/linux)主機之間的文件系統共享。
79. 在Linux操作系統中,設備都是通過特殊的 文件 來訪問。
80. shell不僅是 用戶命令的解釋器 ,它同時也是一種功能強大的編程語言。 bash是Linux的預設shell。
81. 用 >;>; 符號將輸出重定向內容附加在原文的後面。
82. 增加一個用戶的命令是:adser 或useradd 。
83 進行字元串查找,使用grep命令。
84. 使用 * 每次匹配若干個字元。
85. /sbin 目錄用來存放系統管理員使用的管理程序。
二、單項選擇題:
1. 下面的網路協議中,面向連接的的協議是: A 。
A 傳輸控制協議 B 用戶數據報協議 C 網際協議 D 網際控制報文協議
2. 在/etc/fstab文件中指定的文件系統載入參數中, D 參數一般用於CD-ROM等移動設備。
A defaults B sw C rw和ro D noauto
3. Linux文件許可權一共10位長度,分成四段,第三段表示的內容是 C 。
A 文件類型 B 文件所有者的許可權
C 文件所有者所在組的許可權 D 其他用戶的許可權
4. 終止一個前台進程可能用到的命令和操作 B 。
A kill B ;+C C shut down D halt
5.在使用mkdir命令創建新的目錄時,在其父目錄不存在時先創建父目錄的選項是 D 。
A -m B -d C -f D -p
6. 下面關於i節點描述錯誤的是 A 。
A i節點和文件是一一對應的
B i節點能描述文件佔用的塊數
C i節點描述了文件大小和指向數據塊的指針
D 通過i節點實現文件的邏輯結構和物理結構的轉換
7. 一個文件名字為rr.Z,可以用來解壓縮的命令是: D 。
A tar B gzip C compress D uncompress
8. 具有很多C語言的功能,又稱過濾器的是 C 。
A csh
B tcsh
C awk
D sed
9. 一台主機要實現通過區域網與另一個區域網通信,需要做的工作是 C 。
A 配置域名伺服器
B 定義一條本機指向所在網路的路由
C 定義一條本機指向所在網路網關的路由
D 定義一條本機指向目標網路網關的路由
10. 建立動態路由需要用到的文件有 D 。
A /etc/hosts B /etc/HOSTNAME C /etc/resolv.conf D /etc/gateways
11. 區域網的網路地址192.168.1.0/24,區域網絡連接其它網路的網關地址是192.168.1.1。主機192.168.1.20訪問172.16.1.0/24網路時,其路由設置
正確的是 B 。
A route add –net 192.168.1.0 gw 192.168.1.1 netmask 255.255.255.0 metric 1
B route add –net 172.16.1.0 gw 192.168.1.1 netmask 255.255.255.255 metric 1
C route add –net 172.16.1.0 gw 172.16.1.1 netmask 255.255.255.0 metric 1
D route add default 192.168.1.0 netmask 172.168.1.1 metric 1
12. 下列提法中,不屬於ifconfig命令作用范圍的是 D 。
A 配置本地回環地址 B 配置網卡的IP地址
C 激活網路適配器 D 載入網卡到內核中
13. 下列關於鏈接描述,錯誤的是 B 。
A 硬鏈接就是讓鏈接文件的i節點號指向被鏈接文件的i節點
B 硬鏈接和符號連接都是產生一個新的i節點
C 鏈接分為硬鏈接和符號鏈接 D 硬連接不能鏈接目錄文件
14. 在區域網絡內的某台主機用ping命令測試網路連接時發現網路內部的主機都可以連同,而不能與公網連通,問題可能是 C。