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
33、寫乙個「標準」巨集,這個巨集輸入兩個引數並返回較#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));
小的乙個。
【標準答案】#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 在模組內,...