MicroBlaze:malloc 函數(shù)動(dòng)態(tài)分配內(nèi)存溢出
首先說明一點(diǎn),MicroBlaze C函數(shù)庫支持標(biāo)準(zhǔn)的內(nèi)存管理函數(shù),如malloc(),calloc(), free(),這些標(biāo)準(zhǔn)的C函數(shù)庫定義在libc.a中。動(dòng)態(tài)內(nèi)存分配從內(nèi)存的程序的堆(heap)中提供。所以堆的大小會(huì)直接影響調(diào)用malloc內(nèi)存分配的大小。而堆的大小(heap size)是不能在運(yùn)行的時(shí)候增加,這樣需要在程序編譯的時(shí)候確定合適的堆的大小,在大小可以EDK下generate linker script的時(shí)候,或者直接修改*.ld文件,例如:
本文引用地址:http://cafeforensic.com/article/201710/365663.htm_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x1000;
_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x1000;
如果調(diào)用malloc(int size)函數(shù)的時(shí)候出現(xiàn),malloc函數(shù)返回NULL,這就說明內(nèi)存分配失敗,原因是:
申請(qǐng)的內(nèi)存的大小可能超過了內(nèi)存本身的大小
申請(qǐng)內(nèi)存的大小超過了heap_size的大小
針對(duì)以上兩個(gè)原因,可以這樣做修改heap_size 和增加實(shí)際的物理內(nèi)存。
這里要提醒一點(diǎn):每次調(diào)用malloc,必須檢查一下返回值,以保證實(shí)際內(nèi)存分配的請(qǐng)求。
在實(shí)踐中,本人通過malloc申請(qǐng)一塊近乎3MB內(nèi)存空間用于存儲(chǔ)圖像數(shù)據(jù),但是因?yàn)槎言O(shè)置得太小了,返回值一直為NULL,內(nèi)存分配失敗。
調(diào)用malloc代碼
void *zalloc(unsigned long size)
{
void *ret = malloc(size);
if (ret) memset(ret, 0, size);
return ret;
}
評(píng)論