奔跑的記憶體 C語言的陷阱和缺陷

2021-05-25 07:55:57 字數 482 閱讀 9268

int i, a[10];

for(i = 1; i <= 10; i++)

a[i] = 0;

這個例子的目的是要將a中的每個元素都設定為0,但沒有期望的效果。因為for語句中的比較i < 10被替換成了i <= 10,a中的乙個編號為10的並不存在的元素被設定為了0,這樣記憶體中a後面的乙個字被破壞了。如果編譯該程式的編譯器按照降序位址為使用者變數分配記憶體,則a後面就是i。將i設定為零會導致該迴圈陷入乙個無限迴圈。

程式的記憶體分布:

全域性變數和靜態變數的記憶體布局:全域性變數和靜態變數記憶體布局基本相同,主要是遵循乙個大的原則,將初始化的和未初始化的變數分開存放。初始化的變數被放在全域性資料區,未初始化的變數放在

bss段。這樣有乙個好處,bss段在檔案中是沒有大小的,只有乙個位址,所有未初始化的全域性靜態變數都指向這個位址,這樣可以減小檔案的大小。而在執行時,才會為bss段分配記憶體空間,並且全部初始化為0,所以未初始化的全域性/靜態變數載入記憶體後,預設值為0。

C陷阱和缺陷 連線

一,概念 聯結器的作用在於把有編譯器或彙編器生成的若干個目標模組,整合成乙個被稱為載入模組或可執行檔案的實體,該實體能夠被作業系統直接執行。其中,某些模組式直接作為輸入提供給聯結器的 而另外一些目標木塊則是根據連線過程的需要,從包括有型別printf函式的庫檔案中取得的。二,連線過程問題的根源 c程...

C語言陷阱與缺陷(5)

庫函式 1.返回整數的getchar函式 記住 getchar的返回型別為int 而不是char.2.更新順序檔案 乙個檔案輸入操作不能隨後緊跟乙個檔案輸出操作,反之亦然。若要同時進行檔案輸入 輸出操作,必須在其中插入 fseek函式的呼叫 用於改變檔案的狀態,使其能正常的讀取 3.緩衝輸出與記憶體...

C語言缺陷與陷阱(6)

預處理器 巨集 一種對組成 c程式的字元進行變換的方式,而並不作用於程式中的物件。1.不能忽視巨集定義中的空格 define f x x 1 被翻譯為 f 代表 x x 1 2.巨集並不是函式 巨集定義中最好把每個引數都用括號括起來,整個結果表示式也應該用括號括起來。要確保巨集中的引數沒有 如,引數...