【2】內存管理 (1)動態內存 1)C/C++定義了4個內存區間: 代碼區/全局變量與靜態變量區常量(數字或者字符串)/局部變量區即棧區/動態存儲區,即堆區。 2)靜態存儲分配 一般定義變量,編譯器在編譯時均可以根據該變量的類型知道所需內存空間的大小, 從、而系統在適當的時候爲他們分配肯定的存儲空間。 在棧上建立。在執行函數時,函數內局部變量的存儲單元均可以在棧上建立, 函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高, 可是分配的內存容量有限。 (2)動態存儲分配 1)有些操做對象只有在程序運行時才能肯定,這樣編譯器在編譯時就沒法爲他們預約存儲空間, 只能在程序運行時,系統根據運行時的要求進行內存分配,這種方法稱爲。 2)全部動態存儲分配都在堆區中進行。 3)從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc申請任意多少的內存, 程序員本身負責在什麼時候用free釋放內存。動態內存的生存期由咱們決定,使用很是靈活,但問題也最多。 (3)堆內存的分配與釋放 1) 當程序運行到須要一個動態分配的變量或對象時,必須向系統申請取得堆中的一塊所需大小的存貯空間, 用於存貯該變量或對象。當再也不使用該變量或對象時,也就是它的生命結束時,要顯式釋放它所佔用的存貯空間, 這樣系統就能對該堆空間進行再次分配,作到重複使用有限的資源。 2) 堆區是不會自動在分配時作初始化的(包括清零),因此必須用初始化式(initializer)來顯式初始化。 3) malloc/free void * malloc(size_t num) void free(void *p) a. malloc函數自己並不識別要申請的內存是什麼類型,它只關心內存的總字節數。 b. malloc申請到的是一塊連續的內存,有時可能會比所申請的空間大。其有時會申請不到內存,返回NULL。 c. malloc返回值的類型是void *,因此在調用malloc時要顯式地進行類型轉換,將void * 轉換成所須要的指針類型。 d. 若是free的參數是NULL的話,沒有任何效果。 e. 釋放一塊內存中的一部分是不被容許的。
#include <stdio.h> #include <stdlib.h> int main(int argc, const char *argv[]) { char *p; p = (char *)malloc(10*sizeof(char)); if(p == NULL) { printf("malloc failed\n"); return 0; } printf("p = %p\n",p); printf("input:"); scanf("%s",p); printf("%s\n",p); free(p); return 0; }