函式宣告:(返回為(void *)型別)
void *malloc(
size_t size
);
需要的標頭檔案:
#include 或
#include
應用:(指標
型別) 變數名 =(指標
型別)malloc(n * sizeof(型別));//(指標
型別)強轉為同變數型別;
如:int *arr = (int *)malloc( n * sizeof( int )); //分配n個(int)大小的記憶體,arr指向該記憶體的首部;malloc的「近親」:calloc,realloc;相當於:int arr[n]; //c99不支援;大部分編譯器會出現語法錯誤;
當n=4時,
函式宣告:(返回為(void *)型別)
void *calloc(
size_t num,
size_t size
);
同malloc函式相同的標頭檔案:
#include 或
#include
應用:(指標
型別) 變數名 =(指標
型別)calloc(n ,sizeof(型別));//(指標
型別)強轉為同變數型別;
如:int *arr = (int *) calloc ( n , sizeof(int) ); //將n個(int)初始化為0;arr指向該記憶體首部;作用:(對原記憶體進行擴充)在記憶體的動態儲存區分配m(新的大小)個長度為size(型別)的連續空間,將原來的內容拷貝到新的記憶體;相當於:int *arr = (int*) malloc (a*sizeof(int));
注意:新的大小可小。如果新的記憶體大於原記憶體,則新分配部分不會被初始化;如果新的記憶體小於原記憶體,則可能會導致資料丟失。
函式宣告:(返回為(void *)型別)
void *realloc(
void *memblock,
size_t size
);
同malloc函式相同的標頭檔案:
#include 或
#include
應用:(
指標型別)變數名 =
(指標型別)realloc(原記憶體的指標名,新的大小);//
(指標型別)強轉為同變 量型別;
如:int *brr = (int *)realloc(arr,2*n*sizeof(int)); //將arr的內容存入2*n*sizeof(int)的記憶體中;brr指向 新的記憶體;
作用:釋放malloc、calloc、realloc函式給指標變數分配的記憶體空間的函式,使用後將該指標變數指向null,防止野指標。
函式宣告:
void free(
void *memblock
);
應用:free(動態記憶體的指標);
如:free(arr);注意:系統在分配記憶體時,為了好管理,通常在記憶體首尾增加標識。如果在使用記憶體時越界,free()函式在釋放記憶體時崩潰。
可能「崩潰」的原因:1、越界。如:malloc函式漏寫sizeof,realloc第二個引數寫錯
2、改變指標的指向(free()通過首部標識釋放記憶體)。如:p++
3、重複釋放記憶體。如:釋放同一記憶體。(避免發生,將 p=null;)
4、釋放不是動態申請的記憶體(動態申請的記憶體才有首尾標識)。如:int *p = (int *)malloc(40);
int *q = p;
free(p);
free(q);
int arr[10];
free(arr);
C語言中動態記憶體的申請和釋放
什麼是動態記憶體的申請和釋放?當程式執行到需要乙個動態分配的變數時,必須向系統申請取得堆中的一塊所需大小的儲存空間,用於儲存該變數。當不再使用該變數時,也就是它的生命結束時,要顯式釋放它所占用的儲存空間,這樣系統就能對該堆空間進行再次分配,做到重複使用有限的資源。在c語言中動態記憶體的申請和釋放 1...
記憶體(堆)的動態申請和釋放
需要標頭檔案 stdlib.h void malloc size t size void free void ptr 需要說明的是 申請 1 引數是申請記憶體的位元組數。2 申請的是一塊連續的記憶體。3 返回值是void 型別,因此,要將他的返回值付給乙個指標的時候,一定要型別轉換。釋放 1 引數是...
c 高階 申請和釋放動態陣列
new 型別名t 第一維陣列長度 第二維陣列長度 如果記憶體申請成功,new運算返回乙個指向新分配記憶體首位址的指標。但返回的還是正常的指標嗎?答案是否定的,他應該返回乙個指向陣列的指標,即對其加一會跨越整個陣列空間。其中三維陣列應該用乙個二維陣列的指標來接收。需要注意的是,通過new申請的資源需要...