C專家程式設計 5 6

2021-04-02 10:27:09 字數 2788 閱讀 1086

執行是的資料結構

1、a.out

是編譯和鏈結的輸出檔案

2、幾種檔案格式

system v

的可執行檔案格式

elf

(extensible linker format or executable and linking format

)其他一些系統的檔案格式:

coff (common ojbect-file format)

公共目標檔案格式3、

size a.out

可以輸出三個段(文字、資料、

bss)的大小,nm和

dump

都可以用於檢視可執行檔案的內容。

bss段內只註明定義而未初始化的變數的大小

資料段為初始化後的全域性和靜態的變數

4、執行時載入器取檔案中的段的映象放入記憶體中(圖2)

按bss

段的大小在記憶體中開出乙個記憶體區

堆疊段用於儲存區域性變數、臨時資料、傳遞到函式的引數,還有通過

malloc

()函式分配的記憶體。

位址最低端未被對映的部分,對他的引用將會引起錯誤,他用於捕捉使用空指標和小整數型值的指標引用記憶體的情況。

5、程式執行時資料結構有堆疊、活動記錄、資料、堆

堆疊通過

sp維護,並且可以修改堆疊裡面的值

堆疊的三個作用:

內部聲名的區域性變數、函式呼叫時儲存一些維護性資訊、

malloc

()函式分配空間

6、過程活動記錄在記憶體中的布局

對區域性變數指標的引用會造成錯誤7、

setjmp

和longjmp

的用途setjmp

(jmp-buf j

)先被呼叫,使用變數記錄當前的位置(pc和

sp),返回0;

longjmp

(jmp-buf j, int i)//

返回到j

記錄的位置,函式返回

i;還登出了

j的內容;

setjmp/longjmp

的用途是錯誤返回;

8、一些工具

對記憶體的思考

1、intel8086的20

位位址形成

1、intel 80x86

記憶體模型和工作原理

8086

的段是一塊

64k的記憶體區域,段位址放在段暫存器中,偏移位址(段內位址)為指令提供;

2、虛擬記憶體

虛擬記憶體以「頁」的形式組織,可以通過

/usr/ucb/pagesize

來觀察你的系統頁的大小,

mmu對頁進行管理和操作

3、每個程序記憶體管理

管理記憶體可呼叫:

malloc

和free

——從記憶體中分配指定大小的記憶體塊和釋放

brk和

sbrk

——調整資料段的大小至乙個絕對值

4、記憶體洩露問題

堆出現的兩個問題(1

)、使用未釋放的記憶體區(資料錯誤)(2

)、未釋放不用的記憶體區(記憶體洩露)

可以使用

/usr/sbin/swap –s

來檢視有多少可用的交換空間

5、匯流排錯誤(1

)、bus error

(core dumped

)匯流排錯誤(資訊轉儲)

在分配記憶體的時候都以型別大小的整數倍為邊界,若位址未對齊是進行讀或寫就會引起匯流排錯誤,象將

char

的指標轉換為

int指標就會出錯。(2

)、segmentation error

(core dumped

)段錯誤

(資訊轉儲)

由於記憶體管理單元的異常所致,解除乙個未初始化或非法值的指標引起的

引起段錯誤的幾個原因:

1)、解除引用乙個非法指標

2)、解除引用乙個空指標

3)、在未得到許可權的時進行訪問

4)、用完堆疊和記憶體

發生的頻率:

a、壞指標的使用;

b、改寫的錯誤(超過陣列的邊界);

c、指標釋放的錯誤(多次釋放指標和釋放未使用的記憶體);

系統在出現匯流排錯誤和段錯誤後進行資訊轉儲並終止,也可以設定乙個訊號處理程式進行處理

C專家程式設計

說到c語言,首稱 c程式語言 這是一本入門和進修均可的書籍,值得讀三遍以上,方才有味。進修書籍如 c專家程式設計 是一本c語言較高層次的書,是成為c語言專家的必經之路。我自以為達到了一定的 程度,才開始學習這本書的。人言,c語言是一門藝術,需要多年歷練才能達到較為完善的境界,此言不虛。c語言進修書籍...

C 專家程式設計

2011.9.4 c 專家程式設計 1 容易混淆的 const 關鍵字const 並不能把乙個變數變為常量,它修飾的符號僅表示該符號的值不能被賦值,也就意味著唯讀不可寫,但它並不能防止通過程式內部 甚至外部,其它函式 的方法來修改它。const 最有用支出是用來限定函式的形參,這樣該函式不會修改實參...

c專家程式設計

pag13 關於替代庫函式 標準規定編譯器只有在違反語法規則和約束條件的情況下才能產生錯誤資訊。所有c語言標準標頭檔案中宣告的識別符號均保留,所以不能宣告乙個叫做malloc 的函式,因為在標準標頭檔案裡已經有乙個函式以此為名。但由於這個規定不是約束條件,因此可以違反他。所以可以用自己宣告的函式來替...