動態儲存分配
在陣列一章中,曾介紹過陣列的長度是預先定義好的,在整個程式中固定不變。c語言中不允許動態陣列型別。
例如:int n;
scanf("%d",&n);
int a[n];
用變數表示長度,想對陣列的大小作動態說明,這是錯誤的。但是在實際的程式設計中,往往會發生這種情況,即所需的記憶體空間取決於實際輸入的資料,而無法預先確定。對於這種問題,用陣列的辦法很難解決。為了解決上述問題,c語言提供了一些記憶體管理函式,這些記憶體管理函式可以按需要動態地分配記憶體空間,也可把不再使用的空間**待用,為有效地利用記憶體資源提供了手段。
常用的記憶體管理函式有以下三個:
1. 分配記憶體空間函式malloc
呼叫形式:
(型別說明符*)malloc(size)
功能:在記憶體的動態儲存區中分配一塊長度為"size"位元組的連續區域。函式的返回值為該區域的首位址。
「型別說明符」表示把該區域用於何種資料型別。
(型別說明符*)表示把返回值強制轉換為該型別指標。
「size」是乙個無符號數。
例如:pc=(char *)malloc(100);
表示分配100個位元組的記憶體空間,並強制轉換為字元陣列型別,函式的返回值為指向該字元陣列的指標,把該指標賦予指標變數pc。
2. 分配記憶體空間函式 calloc
calloc 也用於分配記憶體空間。
呼叫形式:
(型別說明符*)calloc(n,size)
功能:在記憶體動態儲存區中分配n塊長度為「size」位元組的連續區域。函式的返回值為該區域的首位址。
(型別說明符*)用於強制型別轉換。
calloc函式與malloc 函式的區別僅在於一次可以分配n塊區域。
例如:ps=(struet stu*)calloc(2,sizeof(struct stu));
其中的sizeof(struct stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu型別,並把其首位址賦予指標變數ps。
2. 釋放記憶體空間函式free
呼叫形式:
free(void*ptr);
功能:釋放ptr所指向的一塊記憶體空間,ptr是乙個任意型別的指標變數,它指向被釋放區域的首位址。被釋放區應是由malloc或calloc函式所分配的區域。
【例】分配一塊區域,輸入乙個學生資料。
main()
*ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name="zhang ping";
ps->***='m';
ps->score=62.5;
printf("number=%d\nname=%s\n",ps->num,ps->name);
printf("***=%c\nscore=%f\n",ps->***,ps->score);
free(ps);
}本例中,定義了結構stu,定義了stu型別指標變數ps。然後分配一塊stu大記憶體區,並把首位址賦予ps,使ps指向該區域。再以ps為指向結構的指標變數對各成員賦值,並用printf輸出各成員值。最後用free函式釋放ps指向的記憶體空間。整個程式包含了申請記憶體空間、使用記憶體空間、釋放記憶體空間三個步驟,實現儲存空間的動態分配。
摘自:
malloc函式及用法
動態儲存分配 在陣列一章中,曾介紹過陣列的長度是預先定義好的,在整個程式中固定不變。c語言中不允許動態陣列型別。例如 int n scanf d n int a n 用變數表示長度,想對陣列的大小作動態說明,這是錯誤的。但是在實際的程式設計中,往往會發生這種情況,即所需的記憶體空間取決於實際輸入的資...
malloc函式及用法
吸收和補充 動態儲存分配 在陣列一章中,曾介紹過陣列的長度是預先定義好的,在整個程式中固定不變。c語言中不允許動態陣列型別。例如 int n scanf d n int a n 用變數表示長度,想對陣列的大小作動態說明,這是錯誤的。但是在實際的程式設計中,往往會發生這種情況,即所需的記憶體空間取決於...
malloc函式用法
void malloc int size 說明 malloc向系統申請分配size位元組的記憶體空間,返回型別為void 型別。int p p int malloc sizeof int 注意 1 因為malloc返回的是不確定型別的指標,所以返回之前必須經過型別強制轉換,否則編譯報錯,如 不能將v...