c语言内存管理
c語言內(nèi)存管理
C 語言為內(nèi)存的分配和管理提供了幾個(gè)函數(shù)。這些函數(shù)可以在 <stdlib.h> 頭文件中找到。
上面的圖片來源:https://www.runoob.com/cprogramming/c-memory-management.html
靜態(tài)內(nèi)存分配和動(dòng)態(tài)內(nèi)存分配的區(qū)別:
靜態(tài)內(nèi)存分配 :存儲空間的大小、位置在程序的執(zhí)行過程中不能改變了,程序結(jié)束后內(nèi)存會自動(dòng)的收回。
動(dòng)態(tài)內(nèi)存分配 :在程序執(zhí)行的過程中存儲空間的大小,位置可以發(fā)生改變。
當(dāng)我們要用到一塊內(nèi)存并且知道需要多大的內(nèi)存時(shí)就可以用靜態(tài)內(nèi)存分配,我們可以定義一個(gè)數(shù)組來存放數(shù)據(jù)。
int a[10];//定義了一個(gè)4*10個(gè)字節(jié)大小的內(nèi)存空間,且程序結(jié)束后會自動(dòng)的回收所占用的內(nèi)存。
當(dāng)我們要用空間但是不知道要用多大空間的時(shí)候,就需要?jiǎng)討B(tài)的分配空間,我們需要用定義一個(gè)指針,用指針指向我們開辟的內(nèi)存空間,如果不夠用還可以在添加內(nèi)存空間,最后需要自己回收內(nèi)存。
(1)malloc()函數(shù)
分配失敗返回NULL,分配成功返回一個(gè)指針。
函數(shù)原型: void *malloc(unsigned int num)
例子:
(2)calloc()函數(shù)
分配失敗返回NULL,分配成功返回一個(gè)指針。
函數(shù)原型: void *calloc(unsigned int num,unsigned int size)
例子:
malloc()函數(shù)分配內(nèi)存時(shí)不會初始化數(shù)據(jù),里面的數(shù)據(jù)未知,而calloc()函數(shù)會初始化為0。
例:
(3)recalloc()函數(shù)
分配失敗返回NULL,分配成功返回一個(gè)指針。
函數(shù)原型:void *recalloc(void *address,int newsize);
例:
你可能會這樣想,我如果覺的空間剛開始分配的太少了想擴(kuò)容看以再用一次malloc()或calloc()函數(shù),把內(nèi)存分大點(diǎn),這樣用了兩次malloc()或calloc()函數(shù),這樣是再分配了一塊新的位置新的大小的空間,以前的數(shù)據(jù)找不到了,但是內(nèi)存還在占用。
例:
從上面的圖片可以看出,無論是malloc()還是calloc()函數(shù)它們再給同一個(gè)指針開辟空間,指針的指向變了,也就是說分配了一個(gè)全新的空間,不是和原來空間連著的。
我們下面看一下recalloc():
可以看到用recalloc()函數(shù)重新開辟空間,指針的指向還是原來的指向,以前的數(shù)據(jù)也沒有丟失。
(4)free()函數(shù)
free()函數(shù)無返回值
函數(shù)原型:void free(void *address)
例:
最后補(bǔ)充一下其他的知識點(diǎn):
靜態(tài)存儲: 全局變量(extern),(static)靜態(tài)變量.
動(dòng)態(tài)存儲: 局部變量(auto),寄存器變量(register).
總結(jié)
- 上一篇: C语言输出百分号
- 下一篇: c语言switch()语句