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