MicroBlaze:malloc 函數動態分配內存溢出

2021-01-07 電子產品世界

首先說明一點,MicroBlaze C函數庫支持標準的內存管理函數,如malloc(),calloc(), free(),這些標準的C函數庫定義在libc.a中。動態內存分配從內存的程序的堆(heap)中提供。所以堆的大小會直接影響調用malloc內存分配的大小。而堆的大小(heap size)是不能在運行的時候增加,這樣需要在程序編譯的時候確定合適的堆的大小,在大小可以EDK下generate linker script的時候,或者直接修改*.ld文件,例如:

本文引用地址:http://www.eepw.com.cn/article/201710/365663.htm

_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x1000;
_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x1000;

如果調用malloc(int size)函數的時候出現,malloc函數返回NULL,這就說明內存分配失敗,原因是:

申請的內存的大小可能超過了內存本身的大小

申請內存的大小超過了heap_size的大小

針對以上兩個原因,可以這樣做修改heap_size 和增加實際的物理內存。

這裡要提醒一點:每次調用malloc,必須檢查一下返回值,以保證實際內存分配的請求。

在實踐中,本人通過malloc申請一塊近乎3MB內存空間用於存儲圖像數據,但是因為堆設置得太小了,返回值一直為NULL,內存分配失敗。

調用malloc代碼
void *zalloc(unsigned long size)
{
void *ret = malloc(size);
if (ret) memset(ret, 0, size);
return ret;
}


相關焦點

  • C語言malloc()函數:動態分配內存空間
    頭文件:#include <stdlib.h>malloc() 函數用來動態地分配內存空間(如果你不了解動態內存分配
  • 周立功:動態分布內存——malloc()函數與calloc()函數
    >>>> 1.9 動態分配內存首先回顧一下內存分配,所有程序都必須預留足夠的內存存儲程序使用的數據,這些內存中有些是自動分配的。程序在運行時分配的內存空間稱之為「堆」的存儲池,雖然計算機在硬體上不直接支持堆,但C函數庫(stdlib.h)分別提供了用於動態內存分配和釋放的函數malloc()和free(),即在運行時根據需要創建一個存儲單元,在不需要時釋放。
  • C語言|用指針實現內存動態分配(malloc、calloc函數的使用)
    在C語言中主要用兩種方法使用內存:一種是由編譯系統分配的內存區;另一種是用內存動態分配方式,留給程序動態分配的存儲區。動態分配的存儲區在用戶的程序之外,不是由編譯系統分配的,而是由用戶在程序中通過動態分配獲取的。使用動態內存分配能有效地使用內存,同一段內存區域可以被多次使用,使用時申請,用完就釋放。
  • C語言動態內存管理和動態內存分配
    動態內存管理同時還具有一個優點:當程序在具有更多內存的系統上需要處理更多數據時,不需要重寫程序。標準庫提供以下四個函數用於動態內存管理:(1) malloc()、calloc()分配新的內存區域。(2) realloc()調整已分配的內存區域。(3) free()釋放已分配的內存區域。上述所有函數都聲明在頭文件 stdlib.h 中。對象在內存中所佔空間的大小是以字節數量為單位計算的。
  • 周立功:動態分布內存——free()函數與realloc()函數
    要求每個程序負責回收各自的垃圾,方法是調用free()函數釋放不需要的內存。通常malloc()要與free()配套使用,當動態內存使用完畢時,如果不及時釋放的話,必然導致「內存洩露(即內存空間減少)」,進而影響程序的正常運行。
  • malloc函數及用法
    為了解決上述問題,C語言提供了一些內存管理函數,這些內存管理函數可以按需要動態地分配內存空間,也可把不再使用的空間回收待用,為有效地利用內存資源提供了手段。常用的內存管理函數有以下三個:1. 分配內存空間函數malloc調用形式:(類型說明符*)malloc(size)功能:在內存的動態存儲區中分配一塊長度為"size"字節的連續區域。
  • 在C語言中動態內存該如何分配
    要了解在C語言中動態內存是如何分配的,我們首先要了解什麼是內存的動態分配,之前我們已經介紹過全局變量和局部變量,全局變量是分配在內存中的靜態存儲區的,非靜態的局部變量(包括形參)是分配在內存中的動態存儲區的,這個存儲區是一個稱為棧(stack)的區域。
  • 【221期】面試官:談談內存洩漏和內存溢出的聯繫與區別
    (memory leak)1、內存洩漏是指程序中已動態分配的堆內存由於某種原因未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統奔潰等嚴重後果。二、內存洩漏原因1、在內存中供用戶使用的空間分為三部分:靜態存儲區:靜態存儲區數據在程序開始就已經分配好了內存,執行過程中,它們所佔的存儲單元是固定的,在程序結束時就 釋放,所以該區數據一般為全局變量。動態存儲區:動態存儲區數據是在程序的執行過程中根據需要動態分配和動態釋放的存儲單元。
  • 如何通過wrap malloc定位C/C++程序的內存洩漏
    什麼是動態內存分配器?動態內存分配器是介於kernel跟應用程式之間的一個函數庫,glibc提供的動態內存分配器叫ptmalloc,它也是應用最廣泛的動態內存分配器實現。應用程式可以通過mmap系統直接向kernel申請動態內存,也可以通過動態內存分配器的malloc接口分配內存,而動態內存分配器會通過sbrk、mmap向kernel分配內存,所以應用程式通過free釋放的內存,並不一定會真正返還給系統,它也有可能被動態內存分配器緩存起來。
  • C++ new和malloc的區別
    2.4 自定義類型     new會先調用operator new函數,申請足夠的內存(通常底層使用malloc實現)。然後調用類型的構造函數,初始化成員變量,最後返回自定義類型指針。delete先調用析構函數,然後調用operator delete函數釋放內存(通常底層使用free實現)。
  • malloc、calloc、realloc的區別
    <2>在棧上創建 在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放.棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限.<3>從堆上分配,亦稱動態內存分配.
  • malloc/free與new/delete的區別
    new 和 construct3 operator new對應於malloc,但operator new可以重載,可以自定義內存分配策略,甚至不做內存分配,甚至分配到非內存設備上。因此 C++需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。
  • Linux下malloc/free與new/delete的區別
    由於malloc/free是庫函數,不是運算符,他們不能執行構造函數和析構函數,只是負責分配內存。  1、malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們都可用於申請動態內存和釋放內存。
  • 細說new與malloc的10點區別
    new與malloc的10點區別1、申請的內存所在位置new操作符從自由存儲區(free store)上為對象動態分配內存空間,而malloc函數從堆上動態分配內存。自由存儲區是C++基於new操作符的一個抽象概念,凡是通過new操作符進行內存申請,該內存即為自由存儲區。
  • 淺談malloc與 kmalloc、cmalloc、realloc、new 的區別
    Malloc作 用: Malloc用於動態申請存儲空間,它不是關鍵字,而是一個申請內存的函數用 法:Malloc 返回一塊內存地址的指針,否則會返回空指針null,這裡要注意的是,當內存不再使用的時候,用free()函數進行對內存的釋放。
  • C語言提高篇_malloc,realloc和calloc的區別
    1.malloc()在內存的動態存儲區中分配一塊長度為size字節的連續區域,參數size為需要內存空間的長度,返回該區域的首地址。
  • 作業系統究竟是如何分配內存的?
    在C語言程序開發中,提到動態內存分配時,基本上每個程式設計師都明白 calloc() 和 malloc() 庫函數的區別——calloc() 函數不僅分配內存,還會將分配後的內存清零,而 malloc() 函數則對分配好的內存不做任何操作。
  • 嵌入式系統裸機編程的內存管理簡介
    1、儘量不使用庫自帶的malloc和free。   malloc和free在PC編程中是很好用的一種內存分配手段。但是,其在嵌入式中,就未必好用了。由於嵌入式裸機編程中,無MMU,即內存管理單元。無法實現對內存進行動態映射(不明白什麼叫動態映射的同學,可以參考網上的資料)。也就是說,實際上,malloc和free並不能實現動態的內存的管理。
  • malloc的實現原理
    在開發c或c++時,經常需要分配內存,如今常用的分配內存函數為malloc,tcmalloc,jemalloc,其中屬於malloc使用最平常,
  • C語言:3分鐘看懂 malloc
    關注我不迷路初識 動態內存分配 [C語言必知必會]動態內存分配的引入初學數組的時候,有一個問題經常困擾著我,就是:我們可不可以自己在程序裡定義一個數組的大小而不是在函數開頭先聲明一個很大的數組,然後僅僅使用它的一小部分?