為什么使用動態(tài)內存分配
當你聲明數組時,你必須使用一個編譯時常量來指定數組的長度。但是拳亿,數組的長度常常在運行時才能確定资盅,這是由于它所需要的內存空間取決于輸入的數據调榄。
malloc和free
malloc用來從內存池中提取一塊合適的內存,并向改程序返回一個指向這塊內存的指針呵扛,這塊內存此時并沒有以任何方式進行初始化每庆。
??free用來把前面動態(tài)分配的內存歸還內存池以供后續(xù)。
??這兩個函數的原型如下:
void *malloc(sizze_t size);
void *free(void *pointer);
1.maloc函數的參數就是需要分配的內存(字節(jié))數今穿,malloc分配的內存是連續(xù)的缤灵,當內存池中有sizet_size大小的連續(xù)內存時就返回指向該內存起始位置的指針,如沒有滿足條件的內存就返回NULL。
2.free函數的參數要么是NULL凤价,要么是一個先前從malloc鸽斟,calloc或realloc的返回值,向free傳遞一個NULL不起任何作用利诺。
3.malloc返回的是一個void*類型的指針富蓄,其可以轉換成其它任何類型的指針。
calloc和recalloc
這兩個函數的原型如下:
void *calloc(size_t num_elements,size_t element_sizet );
void *recalloc(void *ptr,size_t new_size);
函數calloc的參數是所需要元素的個數和每個元素所需的字節(jié)數慢逾。
??函數recalloc用于修改一個原先已經分配的內存的大小立倍,使用該函數可以是一塊內存擴大或縮小。
1.calloc也用于分配內存和malloc的最大區(qū)別是前者在返回指向內存的指針前把它初始化為0侣滩;
2.recalloc用于將一塊分配好的內存擴大或縮小口注,當它用于擴大內存時以前這塊內存的內容依然保留,新增加的內存添加到原先內存的后面君珠,用于縮小原來的內存時寝志,該內存塊尾部的部分內存被拿掉,剩余部分的內存內容不變
3.recalloc用于重新分配內存時策添,如果原先的內存大小無法改變recalloc將分配另一塊正確大小的內存材部,并把原先那塊內存的內容復制到新塊上,因此唯竹,在使用recalloc后乐导,不能使用指向原先內存的指針,而是應該使用recalloc所返回的新指針浸颓。
使用動態(tài)分配的內存
??舉例使用動態(tài)分配的內存
int *pi;
pi = malloc(100);
if(pi == NULL)
{
printf("out of memory");
exit(1);
}
常見動態(tài)內存分配的錯誤
??動態(tài)內存分配常見的錯誤有以下幾種:
1.對NULL指針進行解應用操作物臂;
2.對分配的內存進行操作時越界;
3.釋放并非動態(tài)分配的內存产上;
4.試圖釋放動態(tài)內存的一部分或是一塊動態(tài)內存被釋放后被繼續(xù)使用棵磷;
??如下代碼展示一種不容易出錯的動態(tài)內存分配:
??
/*alloc.h*/
#include<stdio.h>
#define malloc
#define MALLOC(num,type) (type*)alloc((num) * sizeof(type))
extern void *alloc(size_t size);
/*alloc.c*/
#include<stdio.h>
#include"alloc.h"
#undeine malloc
void *alloc(size_t size)
{
void *new_mem;
new_mem = malloc(size);
if(new_mem == NULL)
{
printf("out of memory");
exit(1);
}
return new_mem ;
}
/*a_client.c*/
#include"alloc.h"
void function()
{
int *new_memory;
new_memory = MALLOC(25,int);
}
內存泄露
??分配內存但在使用完畢后不釋放內存將引起內存泄露