資料儲存 動態記憶體申請和釋放(c語言)

2021-08-19 04:01:24 字數 2551 閱讀 6119

函式宣告:(返回為(void *)型別)

void *malloc(

size_t size

);

需要的標頭檔案:

#include 或

#include

應用:(指標

型別)  變數名 =(指標

型別)malloc(n * sizeof(型別));//(指標

型別)強轉為同變數型別;

如:int *arr = (int *)malloc( n * sizeof( int )); //分配n個(int)大小的記憶體,arr指向該記憶體的首部;

相當於:int arr[n]; //c99不支援;大部分編譯器會出現語法錯誤;

當n=4時,

malloc的「近親」:calloc,realloc;

函式宣告:(返回為(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指向該記憶體首部;

相當於:int *arr = (int*) malloc (a*sizeof(int));

作用:(對原記憶體進行擴充)在記憶體的動態儲存區分配m(新的大小)個長度為size(型別)的連續空間,將原來的內容拷貝到新的記憶體;

注意:新的大小可小。如果新的記憶體大於原記憶體,則新分配部分不會被初始化;如果新的記憶體小於原記憶體,則可能會導致資料丟失。

函式宣告:(返回為(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;)

int *p = (int *)malloc(40);

int *q = p;

free(p);

free(q);

4、釋放不是動態申請的記憶體(動態申請的記憶體才有首尾標識)。如:

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申請的資源需要...