⑴ 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、代碼區:
存放程序體的二進制代碼。比如我們寫的函數,都是在代碼區的。
通過上面的不同說法,我們也可以看出,這兩種說法本身沒有優劣之分,具體的內存劃分也跟編譯器有很大的關系,因此這兩種說法都是可以接受的,搞明白內存的分區之後,指針的使用才能夠更加的靈活。
;⑵ 常見c語言面試時技巧
常見c語言面試時技巧
常見c語言面試時技巧,職場的道路從來不是一帆風順的,職場上最忌尺寸把握不當,提升自己的能力才是頭等大事,學會放下自己的職場壓力也是很重要的,學會常見c語言面試時技巧,職場達人非你莫屬!
常見c語言面試時技巧1
概念題應試技巧
一般來說,概念題是最容易准備的,只需要將C語言的概念全部熟悉,即可以不變應萬變。如果做不到背出所有的概念,也可以在面試前提前了解所要面試的崗位主要會使用C語言的哪些內容;或者是問問參加過該公司面試的人,曾經問過哪些問題,然後再有針對性地去回答。與此同時,在面試過程中,要注意聽全面試官的問題後,再根據每個小問題分別作答,避免出現只回答半個問題的情況。
案例題應試技巧
案例題主要是指面試官提出一個應用案例,然後讓求職者回答制定問題。這個時候要注意問題中的案例場景,這類問題求職者一般都知道要結合案例本身的情況來作答,不會出太大的問題。但還有一類案例題會偽裝成概念題的樣子,看起來是在問某一個概念,但求職者在回答時除了要解釋相關概念外,還要結合實際工作應用場景中的相關案例來輔助說明該概念,才能拿到滿分。
找錯題應試技巧
雖然一般找錯類的題目會出現在c語言的筆試中,但並不能因此就認為這類題型不會在面試中出現,不少面試官會在面試時突然用口頭表述的方式來出一道找錯題。這個時候求職者需要注意聽全題目,如果記憶力不是特別強的話,最好要用紙筆把題目寫下來,並和面試官確認題目的完整性和正確性,然後再開始作答。避免出現自己沒有聽全題目而找出錯處的尷尬情況。
其實不論是概念題、案例題還是找錯題,c語言面試所有題目的核心目的,都是通過一些題目來考核求職者個人的`知識儲備情況和能力水平。求職者在掌握不同類型題目的應試技巧之餘,更重要的還是通過平時的積累,增強自身的能力水平。
常見c語言面試時技巧2
1、良好的語言習慣
要求不僅不犯語法錯誤,表達流利,用詞得當,而且說話的方式也很重要,需要清晰的發音、適當的語調、自然的聲音、適中的音量等。說話俗語很多、有口頭禪、說話不文明等都是不好的語言習慣。
2、發音清晰
一般人很難清晰地發音,說話有時也不準確。有些人由於發音器官的缺陷一些音素無法發出,如果這些音素嚴重影響人們的理解,或者影響演講的整體質量,面試時應該少用或不使用包含這個音素的單詞。當然,如果有方法可以糾正,要積極的矯正。
3、語調得體
不管是哪種語言,它對各種句型都有語調規范。有些相同的句子,運用不同的語調,可以表達不同的感情,產生不同的效果。如果有人說,"我剛丟了工作。"用同樣的反問句:"真的?"可以表達驚訝、煩惱、懷疑、嘲笑等等。
4、聲音自然
用真實的嗓音說話,語調不要過高或過低,不要迷失自我,不僅聽起來真實自然,而且有助於緩解緊張。
5、音量適中
音量保持在讓聽者聽得清楚即可,適當地壓低聲音比大嗓門要禮貌,聲音很低是一種不自信的表現,所以適中的音量也是很重要的。
6、語速適當
適當的語速並不是從頭到尾都是相同的速度和節奏。必須根據內容的重要性、難度、對方的注意程度來調整語言的速度和節奏。說話的節奏緩慢比急迫的節奏更能被接受。
最後,值得一提的是掌握母語的能力,也就是中國話。許多人在學習外語時願意努力模仿所謂的標准發音,但忽視母語的重要性,不會說標準的普通話,或者在漢語表達中放上一串英語單詞,但不知道這是一種語言缺陷。
大多數人習慣自己的說話方式,語音和語調只是純粹的自我感覺,經常出錯。如果你在日常生活中記錄自己的語言,然後再聽一下,往往很容易發現自己不滿意的地方,這是一種非常合適的自我檢查和調整的方式。
⑶ 計算機程序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語言面試演算法題
1.寫一個函數,它的原形是int continumax(char *outputstr,char *intputstr)
功能:
在字元串中找出連續最長的數字串,並把這個串的長度返回,並把這個最長數字串付給其中一個函數參數outputstr所指內存。例如:"abcd12345ed125ss123456789"的首地址傳給intputstr後,函數將返回
9,outputstr所指的值為123456789。
#include
#include
#include
int FindMax_NumStr(char *outputstr,char *inputstr)
{
char *in = inputstr,*out = outputstr,*temp;
char *final;
int count = 0;
int maxlen = 0;
int i;
while(*in!='