C與C 動態記憶體分配

2021-08-08 15:52:48 字數 1638 閱讀 1409

《1》c語言動態記憶體分配

要實現動態記憶體的分配,除了利用含指標成員的結構體之外,還需利用c語言提供的幾個標準庫函式。(使用時應包含標頭檔案「alloc.h」或「malloc.h」或「stdlib.h」)

1.malloc

函式原型為void *malloc(unsigned int size);在記憶體的動態儲存區中分配一塊長度為"size" 位元組的連續區域。函式的返回值為該區域的首位址。 「型別說明符」表示把該區域用於何種資料型別。(型別說明符*)表示把返回值強制轉換為該型別指標。「size」是乙個無符號數。例如: pc=(char *) malloc (100); 表示分配100個位元組的記憶體空間,並強制轉換為字元陣列型別,函式的返回值為指向該字元陣列的指標, 把該指標賦予指標變數pc。若size超出可用空間,則返回空指標值null。

2.calloc

函式原型為void *calloc(unsigned int num, unsigned int size)

按所給資料個數和每個資料所佔位元組數開闢儲存空間。其中num為資料個數,size為每個資料所佔位元組數,故開闢的總位元組數為num*size。函式返回該儲存區的起始位址。calloc函式與malloc 函式的區別僅在於一次可以分配n塊區域。例如: ps=(struct stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu型別,並把其首位址賦予指標變數ps。

3.realloc

函式原型為void *realloc(void *ptr, unsigned int size)

重新定義所開闢記憶體空間的大小。其中ptr所指的記憶體空間是用前述函式已開闢的,size為新的空間大小,其值可比原來大或小。函式返回新儲存區的起始位址(該位址可能與以前的位址不同)。例如p1=(float *)realloc(p1,16);將原先開闢的8個位元組調整為16個位元組。

**動態申請的記憶體空間要進行手動用free()函式釋放

4.free

函式原型為void free(void *ptr)

將以前開闢的某記憶體空間釋放。函式原型為 void free(void *ptr)其中ptr為存放待釋放空間起始位址的指標變數,函式無返回值。應注意:ptr所指向的空間必須是前述函式所開闢的。例如free((void *)p1);將上例開闢的16個位元組釋放。可簡寫為free(p1);由系統自動進行型別轉換。

《2》c++語言動態記憶體分配

c++語言中用new和delete來動態申請和釋放記憶體。

1. 申請單個物件

int *p;

p=new int;或者 p=new int(value);

2. 動態申請陣列

int *p;

p=new int [100];

這樣可以申請長度為100的陣列,但是不能進行初始化。

3. delete

int *p, *q;

p=new int;

q=new int[10];

delete p;

delete [ ]q;

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

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

c 動態記憶體分配

c語言中提供的動態記憶體分配為了解決陣列的靜態的分配方式的問題 即陣列大小必須在定義時指定,程式在執行時不能動態改變陣列的大小 在標準庫中提供了三個動態記憶體分配的函式供程式呼叫,下面將分別對這三個函式進行介紹 1.void malloc size t size malloc 在分配一段連續的記憶體...

C 動態記憶體分配

c 動態記憶體分配 c c 定義了4個記憶體區間 區,全域性變數與靜態變數區,區域性變數區即棧區,動態儲存區,即堆 heap 區或自由儲存區 free store 堆的概念 通常定義變數 或物件 編譯器在編譯時都可以根據該變數 或物件 的型別知道所需記憶體空間的大小,從而系統在適當的時候為他們分配確...