1. 程式人生 > >c語言動態與靜態分配記憶體空間的區別

c語言動態與靜態分配記憶體空間的區別

所謂動態記憶體分配就是指在程式執行的過程中動態地分配或者回收儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。例如我們定義一個float型陣列:float score[100]; 但是,在使用陣列的時候,總有一個問題困擾著我們:陣列應該有多大?在很多的情況下,你並不能確定要使用多大的陣列,比如上例,你可能並不知道我們要定義的這個陣列到底有多大,那麼你就要把陣列定義得足夠大。這樣,你的程式在執行時就申請了固定大小的你認為足夠大的記憶體空間。即使你知道你想利用的空間大小,但是如果因為某種特殊原因空間利用的大小有增加或者減少,你又必須重新去修改程式,擴大陣列的儲存範圍。這種分配固定大小的記憶體分配方法稱之為靜態記憶體分配。但是這種記憶體分配的方法存在比較嚴重的缺陷,特別是處理某些問題時:在大多數情況下會浪費大量的記憶體空間,在少數情況下,當你定義的陣列不夠大時,可能引起下標越界錯誤,甚至導致嚴重後果。
我們用動態記憶體分配就可以解決上面的問題所謂動態記憶體分配就是指在程式執行的過程中動態地分配或者回收儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。從以上動、靜態記憶體分配比較可以知道動態記憶體分配相對於景泰記憶體分配的特點: 1、不需要預先分配儲存空間; 2、分配的空間可以根據程式的需要擴大或縮小。要實現根據程式的需要動態分配儲存空間,就必須用到malloc函式.
malloc
函式的原型為:void *malloc (unsigned int size) 其作用是在記憶體的動態儲存區中分配一個長度為
size的連續空間。其引數是一個無符號整形數,返回值是一個指向所分配的連續儲存域的起始地址的指標。還有一點必須注意的是,當函式未能成功分配儲存空間(如記憶體不足)就會返回一個NULL指標。所以在呼叫該函式時應該檢測返回值是否為NULL並執行相應的操作。

相關推薦

c語言動態靜態分配記憶體空間區別

所謂動態記憶體分配就是指在程式執行的過程中動態地分配或者回收儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。例如我們定義一個float型陣列:float score[100]; 但是,在使用陣列

簡述C語言動態靜態記憶體分配

#include <stdio.h> #include <stdlib.h> /** c語言靜態記憶體分配 */ void func(int** address ) { //定義int型別的i變數,並賦值100 int i = 100; /

C語言動態靜態記憶體分配

一. 概念: 1. 靜態分配: 編譯器在處理程式原始碼時分配. 2. 動態分配: 程式執行時按動態要求分配.       ※ (1). 靜態分配效率高, 動態分配靈活性高.          (2). 靜態物件都是有名字的變數, 我們直接對其操作, 而動態物件是沒有名字的變

c語言棧及記憶體分配

原文:http://www.cnblogs.com/TonyEwsn/archive/2010/01/29/1659496.html 格式和部分內容稍作修改。 在計算機領域,堆疊是一個不容忽視的概念,我們編寫的C語言程式基本上都要用到。但對於很多的初學著來說,堆疊是

C語言查缺補漏(六)記憶體空間,指標

忽略點六:記憶體空間,指標 ​ 介紹記憶體前,我們首先要知道一個由C/C++編譯的程式佔用的記憶體分為哪幾個部分: ​ ——棧記憶體:C語言程式在編譯時會被分配到記憶體的一片有限的連續區域,這部分記憶體會用於儲存區域性變數(函式中宣告的變數),這部分連續區域被成

C語言的基礎型別的記憶體空間

學習C語言的時候,對C語言的基礎型別所佔用的記憶體空間是非常模糊的。查閱資料,才知道C語言的基礎型別佔用的記憶體空間與編譯器位長有關,常見是16位、32位、64位。維西目前用的是32位、64位編譯器,而16位的資料是查閱資料得來的,問號是尚未查閱到,歡迎糾錯、補充。 i

C語言--動態分配記憶體空間的使用方法

#include <stdio.h> #include <stdlib.h> int main() { int i; int *nums; //為指標分配動態的記憶體空間 // nums = (int *)mall

C語言:動態分配記憶體,malloc()realloc()區別

#include <stdio.h> #include <stdlib.h> //動態分配記憶體標頭檔案 int main() { /* 何為動態?

c語言動態分配記憶體記憶體分配部分函式

#include<stdio.h> /** 在C中動態分配記憶體的基本步驟有: 1,用malloc類的函式分配記憶體; 2,用這些記憶體支援應用程式 3,用free函式釋放記憶體 二、動態記憶體分配函式     malloc :從堆上分配記憶體 &nbs

c語言動態分配空間

問題: typedef struct node{     int num;     struct node*next; }Node,*pNode 在連結串列的create函式中,為什麼定義了連結串列頭之後,以後的每個空間都要new(c++中的用法)或

記憶體動態分配靜態分配

記憶體的靜態分配和動態分配的區別主要是兩個:       一是時間不同。靜態分配發生在程式編譯和連線的時候。動態分配則發生在程式調入和執行的時候。       二是空間不

C語言動態記憶體分配:(一)malloc/free的實現及malloc實際分配/釋放的記憶體

一、malloc/free概述 malloc是在C語言中用於在程式執行時在堆中進行動態記憶體分配的庫函式。free是進行記憶體釋放的庫函式。 1、函式原型 #include <stdlib.h> void *malloc( size_t size

C++動態分配記憶體空間 : new 和 delete

1.什麼是new和delete 在C語言中我們可以利用標準庫函式中的 malloc 和 free 來動態分配記憶體空間,而在C++中提供了運算子 new 和 delete 來取代 malloc 和 f

C語言系列(五)記憶體分配釋放

首先我們來科普一下: 什麼是堆?說到堆,又忍不住說到了棧!什麼是 棧? 1、什麼是堆:堆是大家共有的空間,分全域性堆和區域性堆。全域性堆就是所有沒有分配的空間,區域性堆就是使用者分配的空間。堆在作業系統對程序 初始化的時候分配,執行過程中也可以向系統

C語言動態記憶體分配

malloc()函式:分配記憶體,需要一個引數,所需記憶體位元組數,返回分配的記憶體第一個位元組的地址。ANSI C標準(以前標準返回一個char指標)使用了指向void的“通用指標”來作為malloc()函式返回的指標的型別,在賦值的時候,需要把返回的void的“通用指標

C語言動態記憶體管理和動態記憶體分配

動態記憶體管理同時還具有一個優點:當程式在具有更多記憶體的系統上需要處理更多資料時,不需要重寫程式。標準庫提供以下四個函式用於動態

C語言 檔案大小,分配空間,讀入檔案,寫入檔案,實現複製的功能

首先通過兩種方法得到檔案的大小,位元組為單位,根據這個大小使用malloc分配固定的空間buffer,二進位制流讀入檔案,把二進位制流寫入buffer中,buffer輸出寫入到新的檔案。 原始檔1.txt,輸出檔案1.txt.txt 環境為Ubuntu 16.04,gcc #incl

C 語言動態記憶體

文章目錄 說明 記憶體示意圖 alloc() malloc() calloc() realloc() free() 常見錯誤程式碼例項 說明 主要參考以下部落格:

C語言動態記憶體學習筆記

一、malloc返回引數有兩種情況 1,當分配的記憶體池是空的時候返回一個NULL指標。 2,當可用記憶體無法滿足要求,malloc向作業系統請求,要求更多記憶體,如果它無法向malloc提供更多記憶體就返回一個NULL指標 二、free的引數 free的引數必須是NULL或mall

C語言中呼叫靜態庫函式和動態庫函式的方式

C語言中呼叫動態庫函式的兩種方式 方式一.隱式呼叫 將動態庫的相關檔案拷貝到當前目錄下(lib、dll),然後新增以下程式碼,在程式中指定連線庫函式。 注意:第二個引數給出的是引入庫檔案(或稱“匯出庫檔案”),而不是dll。在程式執行過程中,lib將dll中需要用到的函式對映到對應的記憶