109 對C語言的動態記憶體的分析

2021-10-12 16:25:09 字數 2613 閱讀 7185

int a =10;

//int arr[a];//error

int*arr =

(int*)

malloc

(a*sizeof

(int))

;//等同int arr[a];

malloc calloc realloc三者都是分配記憶體,都是stdlib.h庫里的函式,但是也存在一些差異。

malloc函式

其原型 *void malloc(unsigned int num_bytes);

num_byte為要申請的空間大小,需要我們手動的去計算,如int *p = (int *)malloc(20 *sizeof(int)),如果編譯器預設int為4位元組儲存的話,那麼計算結果是80byte,一次申請乙個80byte的連續空間,並將空間基位址強制轉換為int型別,賦值給指標p,此時申請的記憶體值是不確定的。

calloc函式

其原型void *calloc(size_t n, size_t size);

其比malloc函式多乙個引數,並不需要人為的計算空間的大小,比如如果他要申請20個int型別空間,會int *p = (int *)calloc(20, sizeof(int)),這樣就省去了人為空間計算的麻煩。但這並不是他們之間最重要的區別,malloc申請後空間的值是隨機的,並沒有進行初始化,而calloc卻在申請後,對空間逐一進行初始化,並設定值為0;

calloc函式由於給每乙個空間都要初始化值,效率較malloc要低,很多情況的空間申請是不需要初始值的

#include

#include

intmain()

printf

("\n\n");

printf

("calloc申請的空間的值:\n\n");

realloc函式realloc函式和上面兩個有本質的區別,其原型void *realloc(void *ptr, size_t new_size)

用於對動態記憶體進行擴容及已申請的動態空間不夠使用,需要進行空間擴容操作),ptr為指向原來空間基址的指標, new_size為接下來需要擴充容量的大小。

可從圖看出,擴容後位址和原先位址是不一樣的,但是這僅僅取決於擴容的記憶體大小。

注意

如果size較小,原來申請的動態記憶體後面還有空餘記憶體,系統將直接在原記憶體空間後面擴容,並返回原動態空間基位址;如果size較大,原來申請的空間後面沒有足夠大的空間擴容,系統將重新申請一塊(20+size)*sizeof(int)的記憶體,並把原來空間的內容拷貝過去,原來空間free;如果size非常大,系統記憶體申請失敗,返回null,原來的記憶體不會釋放。注意:如果擴容後的記憶體空間較原空間小,將會出現資料丟失,如果直接realloc(p, 0);相當於free( p )

free:釋放動態記憶體 ,不釋放會出現記憶體洩漏(c/c++ 非常麻煩的問題)

****存被**的情況:1.程序(執行的該程式)結束;2.關機

下面貼上練習**

int

main()

//容量不夠,需要擴容到原來的2倍

/* int *brr = (int *)malloc(2*n*sizeof(int));//建立更大的記憶體

for(i=0;iprintf

("%d\n"

,arr)

;//下面的這一句**等同上面

arr =

(int*)

realloc

(arr,n/2*

sizeof

(int))

;printf

("%d\n"

,arr)

;free

(arr)

;return0;

}

int

main()

//int x;

//printf("\n%d\n",x);

char

*brr =

(char*)

malloc(10

*sizeof

(char))

;char crr[10]

;printf

("%s\n%s\n"

,brr,crr)

;return0;

}

//大記憶體

intmain()

C語言動態記憶體申請分析

1 c語言中的一切操作都是基於記憶體的 2 變數和陣列都是記憶體的別名 1 記憶體分配由編譯器在編譯期間決定 2 定義陣列的時候必須指定陣列的長度 3 陣列的長度是在編譯期間就必須確定的 1 malloc和free用於執行動態記憶體分配和釋放 2 malloc所分配的是一塊連續的記憶體 3 mall...

C語言 動態記憶體

動態記憶體 動態的建立記憶體,申請記憶體空間為變數 存放於堆區,不能通過變數名或陣列名引用,只能通過指標引用,在windows中,堆中最大的連續記憶體塊為1.3g左右。標頭檔案 includemalloc 在空閒記憶體中分配連續記憶體,約等於2g,分配成功時返回乙個指向該記憶體塊的指標即第乙個位元組...

c語言動態記憶體分配 C 動態記憶體分配

動態記憶體分配 雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費 宣告過小,就會影響處理。在c 中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從...