C語言中的記憶體管理
-
malloc函式(memory location 動態記憶體分配)
-
函式原型:
void *malloc(int num);
-
函式功能:用于申請一塊連續的指定大小的記憶體塊區域以void*型別回傳分配的記憶體區域地址,這塊記憶體空間在函式執行完成后不會被初始化,它們的值是未知的,
-
注意點:由于該函式是以void*型別回傳分配的記憶體區域地址的,所以我們需要將該地址強制轉換成我們所需要的型別;
-
舉栗:
int *ptr = (int *) malloc(10 * sizeof(int));
-
-
calloc函式
-
函式原型:
void *calloc(int num, int size); -
函式功能:在記憶體中分配num個大小為size的連續空間,函式回傳一個指向分配起始地址的指標,如果分配不成功的話,那么就會回傳NULL;
-
注意點:與malloc函式存在著一定的區別,malloc函式分配到的空間中的資料都是未知的,隨機的,而calloc函式分配到的空間中的資料都為0;
-
舉栗:
int *ptr = (int *)calloc(10, sizeof(int));
-
-
realloc函式
-
函式原型:
void *realloc(void *address, int newsize); -
函式功能:先判斷當前的指標是否有足夠的連續空間,如果有,擴大address指向的地址,并且將address回傳,如果空間不夠,先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體區域,而后釋放原來address所指記憶體區域(注意:原來指標是自動釋放,不需要使用free),同時回傳新分配的記憶體區域的首地址,即重新分配存盤器塊的地址,
-
注意點:如果重新分配成功則會回傳新分配記憶體的首地址,如果失敗則回傳NULL;
-
舉栗:
int *ptr = (int *)realloc(ptr, 20 * sizeof(int));
-
-
free函式
-
函式原型:
void free(void *address); -
函式功能:該函式會釋放address所指向的記憶體塊,釋放的是動態分配的記憶體空間;
-
注意點:該函式通常與C語言中其他記憶體管理的函式結合使用,可以釋放由 malloc()、calloc()、realloc() 等函式申請的記憶體空間,可以避防止記憶體泄漏的情況發生;
-
舉栗:
free (ptr);
-
-
綜合案例
-
定義一個動態的陣列,陣列的長度是不確定的,用戶直接輸入陣列中的元素,最后遍歷陣列元素并列印;
-
具體代碼如下:
#include <stdio.h> #include <stdlib.h> //通過定義結構體來完成需求 struct dynamicArray { //表示陣列實際長度 int size; //表示陣列的最大長度 int capicity; //接收用戶輸入的值的首地址的指標 int *ptr; }; ? int main() { //自定義結構體名稱 typedef struct dynamicArray dnArray; dnArray arr; //size初始化為0 arr.size = 0; //capicity初始化為4 arr.capicity = 4; //給指標動態分配記憶體 arr.ptr = (int *) malloc(arr.capicity* sizeof(int)); //需要存盤的資料 int num; //通過while回圈來接收用戶輸入的資料 //注意:運行程式時,最后應該輸入ctrl+d/ctrl+z來終止while回圈 //否則該回圈就會一直進行下去,是一個死回圈 while (scanf("%d",&num) == 1) { //給結構體中的陣列賦值 arr.ptr[arr.size] = num; //每讀取一個值,實際長度+1 arr.size++; //如果最大長度==實際長度,就需要給該陣列擴容 if(arr.capicity ==arr.size) { //將陣列的記憶體空間擴大為之前的兩倍 arr.ptr = (int *) realloc(arr.ptr, 2*arr.capicity*sizeof(int)); //最大長度也變化為之前的兩倍 arr.capicity = arr.capicity*2; } } //列印存盤后的結果 for (int i = 0; i < arr.size; i++) { printf("nums[%d] = %d\n", i+1, arr.ptr[i]); } //釋放動態分配的記憶體,避免記憶體泄漏 free(arr.ptr); return 0; }
-

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/45034.html
標籤:C
上一篇:vs2019設定及第三方庫的使用
