C語言 記憶體分配

2021-09-22 21:16:53 字數 1015 閱讀 5301

當你宣告陣列時,你必須使用乙個編譯時常量指定陣列的長度,但是,陣列的長度通常在執行時才知道,這是由於他的記憶體空間取決於輸入資料。但是如果程式需要使用的元素數量超過了宣告的長度,就必須要通過執行動態分配記憶體。
當乙個程式需要另外的記憶體時,它就呼叫malloc函式,malloc從記憶體池中提取一塊合適的記憶體,並向該程式返回乙個指向該記憶體的指標。這塊記憶體並沒有以任何方式進行初始化,如果對這塊記憶體初始化非常重要,你需要自己進行初始化。一般使用memset()進行初始化,void *memset(void *buffer, int c, int count) buffer:為指標或是陣列, c:是賦給buffer的值,count:是buffer的長度

malloc的引數是需要分配記憶體的位元組數,malloc分配的是一塊連續的記憶體,如果作業系統無法向malloc提供更多的記憶體,malloc就返回null。

void *malloc(size_t size)
void *calloc(size_t num_elements,size_t elements_size);
calloc也用於分配記憶體。與malloc的主要區別是calloc在返回指向記憶體指標之前把他初始化為0.這個初始化常常能帶來方便,但是如果你的程式只是想把一些值儲存在陣列,那麼這個初始化過程就是浪費時間;另乙個區別是,他們請求記憶體的方式不同,calloc的引數包括所需元素的數量以及每個元素的位元組數

void realloc(void *ptr,size_t new _size);
realloc用於修改乙個已經分配的記憶體塊的大小,你可以使一塊記憶體擴大或縮小。如果用於擴大一塊記憶體,那麼這塊記憶體原先的資料沒有變化,新增的記憶體新增到原先的記憶體塊後面,新記憶體並沒有以任何方法進行初始化。如果用於縮小,該記憶體塊尾部的部分記憶體便被拿掉。如果原先的記憶體塊無法改變大小,realloc將會分配另一塊正確大小的記憶體,並把原先那塊記憶體的內容複製到這塊記憶體上。如果realloc函式的第乙個引數是null,那麼它的行為就會和malloc一樣

C語言記憶體分配

c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...

C語言記憶體分配

c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...

C語言記憶體分配

objective c從名字來看就可以知道是一門超c語言,所以了解c語言的記憶體模型對於理解objective c的記憶體管理有很大的幫助。c語言記憶體模型圖如下 從圖中可以看出記憶體被分成了5個區,每個區儲存的內容如下 棧區在什麼時候釋放記憶體呢?我們通過下面的乙個例子來說明下 void prin...