c語言中需要記憶體來存放資料。而內

2021-06-26 15:01:35 字數 935 閱讀 1608

1.靜態儲存區分為:唯讀資料(readonly data)區、以讀寫資料(rw data)區、未初始化區(bss)。它們都是在程式編譯連線階段確定的,在程式執行的階段不會改變。

2.動態儲存區分為堆和棧。都是程式執行的過程中動態分配的,大小也隨之動態變化。從記憶體管理的實現的角度看來,堆使用的鍊錶實現的,而棧使用的是線性儲存的方法。

:棧是先進後出,實際的操作中,棧記憶體可以有滿棧和空棧的情況,滿棧的情況下,棧指標當前的位子是已經使用的的棧區域;空棧的情況是,棧指標當前的位子是沒有使用的棧區域,所以兩種情況的出入棧,指標和資料的操作先後順序是不同的。

滿棧時:入棧,是先移動指標,在放入資料;出棧則是先出資料,在移動指標;

空棧時:入棧,是先放入資料,在移動指標。出棧則是先移動指標,在出資料;

c語言必須注意的幾個問題:

1.記憶體洩露:申請一塊記憶體,但沒有釋放,程式結束也沒**,導致其他程式不能使用

2.野指標:指乙個記憶體指標已經被釋放free或者realloc,但指標依然在使用。避免野指標的情況,將記憶體的指標置為null,並在程式使用的時候判斷該記憶體是否為null,如為空,則認為該記憶體已經釋放,不對記憶體進行訪問。

3.非法釋放記憶體:原則上講只有被malloc(),calloc()或realloc()分配並通過返回值返回返回的記憶體才能被釋放,否則釋放除此以外的記憶體都是非法的。即使有乙個指標是*p是malloc,那麼對p1=p++,這個時候free(p1)也是不合法的,但free(p)確實可以的。同樣釋放函式中的區域性變數也是非法的.還有一種情況是,對乙個堆記憶體釋放兩次也是錯誤的用法。因為free()函式是不能釋放未分配的堆記憶體。在程式使用free釋放記憶體之後,應該將指標置為null,free乙個null位址是沒有問題的。

C語言中資料的儲存記憶體

c中的資料在記憶體的儲存可以用儲存時期 作用域和鏈結來體現。儲存時期 儲存時期分為靜態的 自動的和分配的。靜態的變數一般用關鍵字static來標示 全域性變數不用static也是靜態的 它在程式開始執行的時候就為變數分配記憶體空間,在整個程式中一直存在。自動的用auto來標示 預設省略auto 變數...

C語言中區域性變數與全域性變數在記憶體中的存放位置

c語言中區域性變數和全域性變數變數的儲存類別 static,extern,auto,register 在討論函式的形參變數時曾經提到,形參變數只在被呼叫期間才分配記憶體單元,呼叫結束立即釋放。這一點表明形參變數只有在函式內才是有效的,離開該函式就不能再使用了。這種變數有效性的範圍稱變數的作用域。不僅...

C語言中區域性變數與全域性變數在記憶體中的存放位置

c語言中區域性變數和全域性變數變數的儲存類別 static,extern,auto,register 在討論函式的形參變數時曾經提到,形參變數只在被呼叫期間才分配記憶體單元,呼叫結束立即釋放。這一點表明形參變數只有在函式內才是有效的,離開該函式就不能再使用了。這種變數有效性的範圍稱變數的作用域。不僅...