C語言動態內存管理和動態內存分配

2020-12-11 阿里云云棲號

動態內存管理同時還具有一個優點:當程序在具有更多內存的系統上需要處理更多數據時,不需要重寫程序。標準庫提供以下四個函數用於動態內存管理:

(1) malloc()、calloc()分配新的內存區域。

(2) realloc()調整已分配的內存區域。

(3) free()釋放已分配的內存區域。

上述所有函數都聲明在頭文件 stdlib.h 中。對象在內存中所佔空間的大小是以字節數量為單位計算的。許多頭文件(包括 stdlib.h)專門定義了類型 size_t 用來保存這種內存空間的相關信息。例如,sizeof 運算符以類型 size_t 返回字節數量。

動態內存分配

兩個內存分配函數 malloc()和 calloc()的參數不一樣:

void*malloc(size_t size);

函數 malloc()分配連續的內存區域,其大小不小於 size。當程序通過 malloc()獲得內存區域時,內存中的內容尚未決定。

void*calloc(size_t count,size_t size);

函數 calloc()分配一塊內存區域,其大小至少是 count_size。換句話說,上述語句分配的空間應足夠容納一個具有 count 個元素的數組,每個元素佔用 size 個字節。而且,calloc()會把內存中每個字節都初始化為 0。

兩個函數都返回 void 指針,這種指針被稱為無類型指針(typeless pointer)。返回指針的值是所分配內存區域中第一個字節的地址,當分配內存失敗時,返回空指針。

相關焦點

  • 在C語言中動態內存該如何分配
    要了解在C語言中動態內存是如何分配的,我們首先要了解什麼是內存的動態分配,之前我們已經介紹過全局變量和局部變量,全局變量是分配在內存中的靜態存儲區的,非靜態的局部變量(包括形參)是分配在內存中的動態存儲區的,這個存儲區是一個稱為棧(stack)的區域。
  • C語言malloc()函數:動態分配內存空間
    頭文件:#include <stdlib.h>malloc() 函數用來動態地分配內存空間(如果你不了解動態內存分配
  • C語言|用指針實現內存動態分配(malloc、calloc函數的使用)
    程序中需要使用各種變量來保存被處理的數據和各種狀態信息,變量在使用前必須被定義且安排好存儲空間(包括內存起始地址和存儲單元大小)。C語言的全局變量、靜態局部變量的存儲是在編譯時確定的,其存儲空間的實際分配在程序開始執行前完成。
  • C語言內存相關知識
    動態內存分配這裡說一下為什麼要使用動態內存分配,C語言中一切操作都是基於內存的,變量和數組都是內存的別名,如何分配這些內存由編譯器在編譯期間決定,所以定義數組的時候必須指定數組長度,兒數組長度是再編譯器就必須決定了,但是,程序運行過程中,可能需要使用一些額外空間。
  • MicroBlaze:malloc 函數動態分配內存溢出
    首先說明一點,MicroBlaze C函數庫支持標準的內存管理函數,如malloc(),calloc(), free(),這些標準的C函數庫定義在libc.a中。動態內存分配從內存的程序的堆(heap)中提供。
  • 理解 Go 內存管理之內存分配
    閱讀的前置知識什麼是內存、虛擬內存、常見的分配算法、內存分配的目標、TCmallocGo語言內存分配全局視野span與元素Go語言將內存分成了大大小小67個級別的span,其中0級代表特殊的大對象,其大小是不固定的。當具體的對象需要分配內存時,並不是直接分配span,而是分配不同級別的span中的元素。
  • 周立功:動態分布內存——free()函數與realloc()函數
    第一章為程序設計基礎,本文為1.9.3  free()函數和1.9.4 realloc()函數。>>>> 1.9.3 free()函數 對於程序而言,不可再訪問的內存塊被稱為垃圾,留有垃圾的程序存在內存洩漏現象。雖然一些語言提供了垃圾收集器用於垃圾的自動定位和回收,但C語言不提供。
  • C語言calloc的效率為何那麼高?作業系統究竟是如何分配內存的?
    在C語言程序開發中,提到動態內存分配時,基本上每個程式設計師都明白 calloc() 和 malloc() 庫函數的區別——calloc() 函數不僅分配內存,還會將分配後的內存清零,而 malloc() 函數則對分配好的內存不做任何操作。
  • C語言中的指針和內存洩漏
    引言對於任何使用 C 語言的人,如果問他們 C 語言的最大煩惱是什麼,其中許多人可能會回答說是指針和內存洩漏
  • 周立功:動態分布內存——malloc()函數與calloc()函數
    >>>> 1.9 動態分配內存首先回顧一下內存分配,所有程序都必須預留足夠的內存存儲程序使用的數據,這些內存中有些是自動分配的。程序在運行時分配的內存空間稱之為「堆」的存儲池,雖然計算機在硬體上不直接支持堆,但C函數庫(stdlib.h)分別提供了用於動態內存分配和釋放的函數malloc()和free(),即在運行時根據需要創建一個存儲單元,在不需要時釋放。
  • 一個產品級MCU內存管理方案
    如果將這些變量定義為指針,當要使用時,通過內存管理分配,使用完後就釋放,這就叫做動態分配。那麼,如果不使用動態內存,則需要3K變量。如果使用內存管理動態分配,則只需要1K內存就可以了。內存分配模塊我們使用K&R C examples作為基礎,然後進行優化。K&R是誰?就是寫《C程序設計語言》的兩個傢伙。如果你沒有這本書,真遺憾。
  • Python中的內存分配和管理
    了解內存管理可以幫助您編寫高效的Python代碼。儘管您可能無法控制內存分配,但是您可以優化程序來更好地分配內存。在深入研究之前,請記住:在python中,一切都是對象。與C,C ++或Java不同,值存儲在內存中,並且變量指向該內存位置。
  • 嵌入式系統裸機編程的內存管理簡介
    1、儘量不使用庫自帶的malloc和free。   malloc和free在PC編程中是很好用的一種內存分配手段。但是,其在嵌入式中,就未必好用了。由於嵌入式裸機編程中,無MMU,即內存管理單元。無法實現對內存進行動態映射(不明白什麼叫動態映射的同學,可以參考網上的資料)。也就是說,實際上,malloc和free並不能實現動態的內存的管理。
  • Linux平臺中調試C/C++內存洩漏方法 (騰訊和MTK面試的時候問到的)
    本文將從靜態分析和動態檢測兩個角度介紹在 Linux 環境進行內存洩漏檢測的方法,並重點介紹靜態分析工具 BEAM、動態監測工具 Valgrind 和 rational purify 的使用方法。相信通過本文的介紹,能給大家對處理其它產品或項目內存洩漏相關的問題時提供借鑑。從 歷史上看,來自計算機應急響應小組和供應商的許多最嚴重的安全公告都是由簡單的內存錯誤造成的。
  • C語言的那些小秘密之動態數組
    尤其對於搞嵌入式的人來所,嵌入式系統的內存是寶貴的,內存是否高效率的使用往往意味著嵌入式設備是否高質量和高性能,所以高效的使用內存對我們來說是很重要的。那麼我們在自己編寫C語言代碼的時候就應該學會使用動態數組,這也就是我這篇博客要給大家講的,我盡我所能的用一些簡單的代碼來講解動態數組,希望我所講的對你有所幫助。
  • c++之內存分配、命名空間、強制類型轉換學習總結
    一、C++動態內存分配:在學習c語言的時候,我們一般都是使用庫函數malloc()來進行內存的申請分配,然後使用庫函數free()來進行釋放申請到的內存;現在在c++裡面採用了另外一種內存申請的方法:c++中通過
  • C語言編程技巧:以實例跟我學動態數組的創建及使用方法
    其特點是定義方便,無需管理其內存的佔用情況,但其缺點是一旦定義後,其數組的長度就固定了,而不能動態的改變其大小。在C語言中提供了諸如內存的申請、釋放等管理函數,然後結合指針可以按需動態地分配內存空間,來構建動態數組,達到有效利用計算機內存資源的手段。
  • 淺析java內存管理機制
    不同的程式語言有不同的內存管理機制,本文在對比C++和Java語言內存管理機制的不同的基礎上,淺析java中的內存分配和內存回收機制,包括java對象初始化及其內存分配,內存回收方法及其注意事項等……但是C++這種直接操作內存的方式存在很大內存洩露風險,而且人為管理內存複雜且困難。
  • JavaScript內存管理機制以及四種常見的內存洩漏解析
    同時,本文還將提供一些處理JavaScript內存洩漏的技巧,既能確保SessionStack不會出現內存洩漏,也不會增加web應用程式的內存佔用。概述像C這樣的程式語言都會有低級別的內存管理原語,例如malloc()和free()。開發人員使用這些原語能夠顯式地對內存進行分配和釋放。
  • Python內存管理大揭秘
    前言語言的內存管理是語言設計的一個重要方面。它是決定語言性能的重要因素。無論是C語言的手工管理,還是Java的垃圾回收,都成為語言最重要的特徵。這裡以Python語言為例子,說明一門動態類型的、面向對象的語言的內存管理方式。