C語言 動態記憶體分配

2021-06-22 01:27:46 字數 1394 閱讀 4831

c語言有儲存變數的區域稱之為棧(stack)  除此之外 c語言還允許建立自己的動態記憶體區域  以存放一些臨時的資料  這區域稱之為 堆(heap)  也就是存放執行時的資料   可以根據程式的需要 向系統申請所需大小的空間   由於未宣告部分定義他們為變數或者陣列因此只能通過指標去訪問

建立記憶體動態分配主要由4個函式來完成  malloc , calloc,  free, realloc

原型void *malloc(unsigned size);

1:使用malloc  作用是在記憶體的動態區域中分配乙個長度為size的連續空間

size 不允許為負數 單位位元組

返回乙個指標變數可以強轉為自己需要的型別

空間不足 返回null

int (*p)[4] = malloc(1024 * 1024 );

for (int  i = 0; i < 4; i++)

}for (int *pp = p; pp < p[0] + 16; pp++)

2:使用 free函式

作用是釋放指標變數p所指向的記憶體空間  使這一部分能重新被其他變數所使用  

但是,free函式只是釋放指標指向的內容,而該指標仍然指向原來指向的地方,此時,指標為野指標,如果此時操作該指標會導致不可預期的錯誤。安全做法是:在使用free函式釋放指標指向的空間之後,將指標的值置為null。因此,對於上面的demo,需要在return

3. calloc函式

原型   void *calloc(int n,int size);

基本和malloc 類似  不同的是 乙個是引數不同 還有救是 calloc函式得到的記憶體空間是經過初始化的,其內容全為0。calloc函式適合為陣列申請空間,可以將size設定為陣列元素的空間長度,將n設定為陣列的容量。

int *p=calloc(50,4);

for (int i = 0; i < 50; i++)

for (int i = 0; i < 50; i++)

getchar();

4  realloc  擴充套件當前記憶體空間

void * realloc(void * p,int n);  原型

其中,指標p必須為指向堆記憶體空間的指標,即由malloc函式、calloc函式或realloc函式分配空間的指標。realloc函式將指標p指向的記憶體塊的大小改變為n位元組。如果n小於或等於p之前指向的空間大小,那麼在原有的位址之上進行縮小 p 首位址不變。如果n大於原來p之前指向的空間大小,那麼,系統將重新為p從堆上分配一塊大小為n的記憶體空間,同時,將原來指向空間的內容依次複製到新的記憶體空間上,p之前指向的空間被釋放。relloc函式分配的空間也是未初始化的。

也就是說 使用這個函式擴充套件記憶體之後 如果你擴充套件的記憶體比剛才的要小 那麼我什麼都不做 如果大 那麼久重新開闢記憶體 並且首位址返回給你 把原來記憶體之中的資料也拷貝過去

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

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

C語言動態記憶體分配

c語言動態記憶體分配 動態資料結構可以在執行時靈活新增 刪除或重排資料項。在執行時分配記憶體空間的過程稱為動態記憶體分配。記憶體分配函式如下 malloc 分配所需的位元組大小,並返回指向所分配空間的第乙個位元組的指標 calloc 為元素陣列分配空間,並初始化為零,然後返回指向該記憶體的指標 fr...

C語言 動態記憶體分配

動態記憶體分配 一.記憶體的五個分割槽 1.棧區後進先出,從高到底分配記憶體 int a 2 int b 3 printf 棧區 p n a printf 棧區 p n b 2.堆區 堆區分配記憶體,從低到高 堆區的記憶體由我們自己進行分配和釋放 int c malloc 10 printf 堆區 ...