C語言動態記憶體管理

2021-07-25 20:24:11 字數 1636 閱讀 1770

在說明c語言記憶體管理之前,要知道什麼是記憶體,記憶體我個人認為可以理解為帶有標籤的盒子,所謂的帶標籤的盒子就像我們住的寢室一樣有門牌號,盒子內只能儲存固定型別的資料或變數,就如男生寢室只能住男生一樣。那麼c語言中有多少種盒子呢?有靜態儲存區、動態儲存區、內部暫存器區域。我們通常定義的變數如果沒有特意說明型別預設為自動變數型別儲存在動態儲存區,eg:

int a;//其實省略了變數在記憶體的儲存型別宣告(auto)

static int b;//b為靜態變數,只需初始化一次,下次使用時會接著

//上一次的值

靜態變數、動態變數和暫存器變數又有什麼區別和優勢呢?**對於動態儲存區變數通常用於儲存臨時值,動態變數的生命週期小於靜態變數的生命週期,即作用域不同。**典型的例子就是在被呼叫函式中定義的變數,當函式被呼叫時才給函式內部變數分配記憶體空間,當函式呼叫結束後,變數記憶體被**。對於靜態變數而言它存在靜態儲存區,其生命週期比較長,從檔案執行開始直到檔案關閉靜態變數一直存在。暫存器變數一般用到的次數比較少(實際並不是這樣的),暫存器變數的執行速度是最快的,因為其直接儲存在內部的暫存器中,但暫存器變數不能過多,否則cpu會超負荷工作,反而影響效率。所以只有當乙個變數反覆頻繁被呼叫時才可以宣告為暫存器變數。現在的一些編譯器都自帶優化功能,會自動將使用頻繁的變數轉化為暫存器變數。

計算機內部的記憶體空間是連續的,但我們想使用一塊空間來表示有序資料時,我們首先會想到陣列,但陣列有乙個致命的缺點就是分配的記憶體固定,這樣有時會給程式設計者帶來不必要的麻煩,分配太多會造成記憶體浪費,分配少怕不夠用,這時我們可以借助鍊錶或記憶體動態分配函式來做,在這裡主要介紹一下動態記憶體分配。c語言自帶了三個記憶體管理函式,包含在標頭檔案stdlib.h中

1.malloc函式

呼叫形式為: 『』『int *p=(int *)malloc(size)』』』;size為要分配的記憶體的大小,malloc函式分配記憶體空間函式,當分配成功時返回分配的首位址(返回值為void型別),失敗時返回零。

2.calloc函式

與malloc函式的功能相似也是 進行記憶體劃分,但此函式可以一次劃分m個相同大小的記憶體塊。呼叫形式為:』』『int *p=(int *)calloc(m,size)』』』;size為每一塊記憶體所占用的記憶體大小,m表示有多少這樣的記憶體塊。

3.realloc函式

從新分配有malloc或calloc函式分配的記憶體空間。

『』'realloc()原型: void *realloc(void mem_address, unsigned int newsize);』』』

此函式的意義就是將mem_address指向的記憶體從新分配為大小為newsize的新空間。

4.free函式

malloc和calloc函式所開闢的記憶體空間都是在堆中開闢的,所以執行後要使用函式來釋放記憶體。呼叫形式為free§;//p為位址指標

#include "stdafx.h"

#include#includevoid main()

最後說一句堆和棧的區別,在棧中分配的空間程式執行後會自動**,但是在堆中開闢的空間不會主動**

C語言動態記憶體管理

1 概述 動態儲存管理的基本問題是 系統如何按請求分配記憶體,如何 記憶體再利用。提出請求的使用者可能是系統的乙個作業,也可能是程式中的乙個變數。空閒塊 未曾分配的位址連續的記憶體區稱為 空閒塊 占用塊 已分配給使用者使用的位址連續的記憶體區稱為 占用塊 系統剛剛啟動時,整個記憶體可看做乙個大的 空...

C語言動態記憶體管理

c系統的函式庫中提供了了程式動態申請和釋放記憶體儲存塊的庫函式,下面將分別介紹。1 malloc 函式 a 該函式的原型 void malloc size t size b 該函式只有乙個引數,且形參size是無符號整型,該引數代表申請空間的位元組數。c 返回值 如果記憶體池中的可用記憶體滿足需求,...

C 語言動態記憶體管理

int a 10 在棧空間開闢了4個位元組 int arr 10 在棧空間連續開闢了10個連續的4位元組空間 上面的兩行 開闢空間的方式均是開闢了大小固定的空間。但是我們實際對空間的需求,不僅僅是上訴的情況。而是隨著程式執行的時候我們才知道我們需要的空間要多大,那陣列的編譯時開闢空間的方式就不能買滿...