C語言動態內存分配malloc、calloc、realloc

動態內存

根據需要動態創建需要的內存。例如根據變量創建數組,其內存區域在堆。這裏簡單提一下堆與棧

:局部變量所在的內存區域,在Windows默認其大小爲1M,系統自行管理其內存(即你不用管回收問題)

:動態內存所在區域,默認大小爲2G左右(不同平臺有差別),程序管理內存,特別要注意內存釋放

從以上棧與堆的大小可以知道,堆比棧大的多,所以動態內存還有一個使用場景,即需要創建大容量的數組時

malloc、calloc、realloc

malloc(字節數): 創建成功,函數返回一個指向分配起始地址的指針,失敗返回NULL,內存數據爲沒有初始化的隨機值

calloc(單元個數,每個單元的字節數): 創建成功,函數返回一個指向分配起始地址的指針,失敗返回NULL,內存數據初始化爲0

realloc(舊內存地址,新的內存字節大小): 用於修改動態內存的大小

注意:這三個是C語言表中庫中的函數,使用時要引用頭文件stdlib.h,返回的地址都是void*類型,要強制類型轉換成你所要用的類型

malloc與calloc主要區別: 1.malloc內存數據未初始化,爲隨機值,calloc內存數據初始化爲0,
2.malloc只有一個參數,calloc有兩個參數,注意看他們的函數原型聲明:void* malloc(unsigned size); void* calloc(size_t nelem, size_t elsize)

free

free(地址): 釋放動態創建的內存,不釋放會發生內存泄漏
free在使用的時候在以下情況會崩潰:1.越界(動態分配的內存太小)2.動態內存指針發生移動 3.重複釋放

解釋一下第二條動態內存指針發生移動導致free失敗的原因
free函數只有一個參數,即分配的內存的首地址,它只用這一個信息就知道要釋放多大的內存,這是因爲動態分配的內存的那個首地址記錄了它後邊的分配的空間的大小的信息,因此只傳給free函數內存首地址即可,若這個地址(指針)發生了移動,free就會崩潰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章