C語言經典筆試題(二)

2021-07-25 23:54:07 字數 3666 閱讀 5754

21、關鍵字volatile有什麼含意? 並給出三個不同的例

子。 【參***】乙個定義為volatile的變數是說這變數可

能會被意想不到地改變,這樣,編譯器就不會去假設

這個變數的值了。精確地說就是,優化器在用到這個

變數時必須每次都小心地重新讀取這個變數的值,而

不是使用儲存在暫存器裡的備份。下面是volatile變數

的幾個例子:

1). 並行裝置的硬體暫存器(如:狀態暫存器)

2). 乙個中斷服務子程式中會訪問到的非自動變數

(non-automatic variables)

3). 多執行緒應用中被幾個任務共享的變數

22、嵌入式系統經常具有要求程式設計師去訪問某特定的

記憶體位置的特點。在某工程中,要求設定一絕對位址

為0x67a9的整型變數的值為0xaa66。編譯器是乙個純

粹的ansi編譯器。寫**去完成這一任務。

【參***】這一問題測試你是否知道為了訪問一絕對

位址把乙個整型數強制轉換(typecast )為一指標是合

法的。這一問題的實現方式隨著個人風格不同而不同

。典型的類似**如下:

int * ptr;

ptr= (int *)0x67a9;

*ptr = 0xaa55;

23、標頭檔案中的ifndef/define/endif 幹什麼用?

【標準答案】防止該標頭檔案被重複引用。

24、#include

#define swap(x, y) (x)=(x)+(y);(y)=(x)–(y);(x)=(x)–(y);

#define swqp(x,y) (x)=(x)-(y);(y)=(x)+(y);(x)=-((x)-(y));

33、寫乙個「標準」巨集,這個巨集輸入兩個引數並返回較

小的乙個。

【標準答案】#define min(x, y) ((x)>(y)?(y):(x))// 結尾

沒有;34、帶參巨集與帶參函式的區別(至少說出5點)?

【標準答案】

帶參巨集 帶參函式

處理時間 編譯時 執行時

引數型別 無 需定義

程式長度 變長 不變

占用儲存空間 否 是

執行時間 不佔執行時間 呼叫和返回時佔

35、關鍵字volatile有什麼含意?

【標準答案】提示編譯器物件的值可能在編譯器未監測

到的情況下改變。

36、int main()

問函式既然不會被其它函式呼叫,為什麼要返回1?

【標準答案】mian中,c標準認為0表示成功,非0表示

錯誤。具體的值是某中具體出錯資訊。

37、已知乙個陣列tabl e ,用乙個巨集定義,求出資料的

元素個數。

【標準答案】

#define ntbl(table) (sizeof(table)/sizeof(table[0]))
38、a.c 和b.c兩個c檔案中使用了兩個相同名字的

static變數,編譯的時候會不會有問題?這兩個static變數

會儲存到**(棧還是堆或者其他的)?

【標準答案】static的全域性變數,表明這個變數僅在本

模組中有意義,不會影響其他模組。

他們都放在靜態資料區,但是編譯器對他們的命名是

不同的。

如果要使變數在其他模組也有意義的話,需要使用

extern 關鍵字。

39、static全域性變數與普通的全域性變數有什麼區別?

【標準答案】 static全域性變數只初使化一次,防止在其

他檔案單元中被引用;

作用域,static全域性變數限制為當前檔案中。

40、static區域性變數和普通區域性變數有什麼區別

【標準答案】static區域性變數只被初始化一次,下一次

依據上一次結果值;

儲存域,static區域性變數被儲存在靜態資料區,而普通的則存在棧區。

41、static函式與普通函式有什麼區別?

【標準答案】static函式在記憶體中只有乙份,普通函式在

每個被呼叫中維持乙份拷貝。

作用域,static函式限制為當前檔案中。

c語言記憶體分割槽_棧區、堆區、全域性&靜態區、文字常量區、程式**區

c語言開發對記憶體使用有區域劃分,分別是棧區、堆區、全域性&靜態區、文字常量區、程式**區。注意此處的棧、堆名稱有別於資料結構中棧與堆的概念。棧與堆的英文名分別為stack與heap。

棧區:

在函式中定義的變數存放的記憶體區域。

常見的int、float、char等變數均存放於棧區中,它的特點是由系統自動分配與釋放,不需要程式設計師考慮資源**的問題,方便簡潔。

ps:棧區的位址分配是從記憶體的高位址開始向地位址分配。

堆區:

程式設計師通過指令自主向系統申請的記憶體區域,大小由程式設計師決定,它在使用完後同樣需要程式設計師通過指令去釋放該區域記憶體,否則將有可能出現記憶體的浪費與溢位。

c語言中申請堆區指令為:

int p = (int ) malloc( n * sizeof(int) ); //分配n個int型(4位元組)的記憶體,即 4 * n 個位元組

ps:但指標p存放於棧區。

c語言中釋放堆區指令為:

free( p ); //注意此處引數為指標

使用中應該注意,盡量不要去修改p指標對應的位址值,否則在記憶體釋放時將出現錯誤。(編譯可通過,執行出現問題)

全域性變數&靜態變數區:

全域性變數與靜態變數本應是兩個概念,但由於它們在記憶體中存放的區域相同,所以將他們放在一起討論。

全域性變數:

位於所有函式外部定義的變數,在整個工程中可見,可修改。

靜態變數:

位於所有函式內部定義的由 static 修飾的變數,僅在定義的函式中可見,可修改。(這是它與全域性變數的關鍵區別)

ps:靜態變數僅在第一次建立時初始化一次,之後自動跳過初始化語句。

全域性變數與靜態變數均由系統分配和釋放記憶體,若未對它們進行初始化操作,系統將自動將其值設定為0。(堆區與棧區則不會)

文字常量區:

用於存放文字等不可修改的常量,由系統分配和釋放記憶體。

常見的使用:

char *s = 「helloworld」;//該字串 helloworld 即存放於文字常量區,不可修改

ps:但指標s存放於棧區。

pps:若在程式中嘗試對其修改(例如嘗試修改第乙個字元 *s = 『h』;),將出現編譯可通過,執行報錯的情況。

同時因注意它與const修飾的變數之間的區別:

char aa = 『a』;//aa存放於棧區

const char bb = 『b』; //bb同樣存放於棧區

const修飾的變數僅僅用於告訴編譯器bb是乙個常量,如果後續的程式中有出現嘗試修改bb的操作時,編譯將報錯。

這種寫法主要是為了防止程式設計師在後續的**中誤操作bb變數而新增的乙個約束條件,並不會影響它存放的位置。

程式**區:

用於儲存程式編譯連線後生成的二進位制機器碼指令的記憶體區域。該部分內容可通過反彙編操作將機器碼轉換為組合語言。

經典C 語言筆試題目 1

q1 c和c 中struct有什麼區別?q2 c 中的struct和class有什麼區別?a 從語法上講,class和struct做型別定義時只有兩點區別 一 預設繼承許可權。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理 二 成員的預...

經典C 語言筆試題目 3

q1 heap與stack的差別 a heap是堆,stack是棧。stack的空間由作業系統自動分配 釋放,heap上的空間手動分配 釋放。stack空間有限,heap是很大的自由儲存區 c中的malloc函式分配的記憶體空間即在堆上,c 中對應的是new操作符。程式在編譯期對變數和函式分配記憶體...

經典筆試題

1.關鍵字static的作用是什麼?在c語言中,關鍵字static有三個明顯的作用 1 在函式體,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。2 在模組內 但在函式體外 乙個被宣告為靜態的變數可以被模組內所有函式訪問,但不能被模組外其它函式訪問。它是乙個本地的全域性變數。3 在模組內,...