0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

周立功:動態(tài)分布內(nèi)存——malloc()函數(shù)與calloc()函數(shù)

AGk5_ZLG_zhiyua ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2017-08-22 17:01 ? 次閱讀

周立功教授數(shù)年之心血之作《程序設計與數(shù)據(jù)結構》,電子版已無償性分享到電子工程師與高校群體,在公眾號回復【程序設計】即可在線閱讀。書本內(nèi)容公開后,在電子行業(yè)掀起一片學習熱潮。經(jīng)周立功教授授權,本公眾號特對本書內(nèi)容進行連載,愿共勉之。

第一章為程序設計基礎,本文為1.9.1 malloc()函數(shù)和1.9.2 calloc()函數(shù)。

》》》》 1.9 動態(tài)分配內(nèi)存

首先回顧一下內(nèi)存分配,所有程序都必須預留足夠的內(nèi)存存儲程序使用的數(shù)據(jù),這些內(nèi)存中有些是自動分配的。比如,聲明“int iNum;”為一個int類型的值預留了足夠的內(nèi)存,或顯式指定分配一定數(shù)量的內(nèi)存,“int pData[20];”聲明預留了20個內(nèi)存位置,每個位置存儲的是int類型的值。聲明還為內(nèi)存提供了標識符,因此可以使用iNum或pData識別數(shù)據(jù)。靜態(tài)數(shù)據(jù)在程序載入內(nèi)存時分配的,自動數(shù)據(jù)是在程序執(zhí)行時分配的,并在程序離開時銷毀。但C能做的遠不止這些,可以在程序運行時請求所需要的內(nèi)存大小。

程序在運行時分配的內(nèi)存空間稱之為“堆”的存儲池,雖然計算機在硬件上不直接支持堆,但C函數(shù)庫(stdlib.h)分別提供了用于動態(tài)內(nèi)存分配和釋放的函數(shù)malloc()和free(),即在運行時根據(jù)需要創(chuàng)建一個存儲單元,在不需要時釋放。

》》》 1.9.1 malloc()函數(shù)

malloc()函數(shù)原型如下:

void *malloc(unsigned int size);

其中,void *表示該函數(shù)是指針函數(shù),size為所需內(nèi)存的字節(jié)數(shù),可以用sizeof運算符計算每個元素所需要的空間數(shù)量和所有元素需要內(nèi)存的字節(jié)數(shù)。如果分配成功,雖然malloc()不會為分配的內(nèi)存賦名,但它確實返回了動態(tài)分配內(nèi)存塊的首字節(jié)地址。因此可以將該地址賦給一個指針變量,并使用指針變量訪問這塊內(nèi)存。如果分配不成功或內(nèi)存不足,則返回空指針NULL。因此在使用它返回的指針之前,一定要先檢查返回值,否則可能會導致程序非正常終止。比如:

int *pi = malloc(sizeof(int));

if(pi != NULL){

// 指針沒有問題

}else{

// 無效的指針

}

malloc()函數(shù)可用于返回指向數(shù)組的指針、指向結構的指針等,所以通常該函數(shù)的返回值會被強制轉換為匹配的類型,但從C99版本開始,void *類型的指針不需要強制轉換地賦給所有的指針類型變量。

當編寫程序時,常常很難為數(shù)組估計合適的大小,較為方便的做法是等到程序運行時,再來確定數(shù)組的實際大小。其方法是用malloc()在程序執(zhí)行期間為數(shù)組分配空間,然后通過指向數(shù)組第一個元素的指針訪問數(shù)組。假設正在編寫的程序需要n個整數(shù)構成的數(shù)組,這里的n可以在程序執(zhí)行期間計算出來。首先需要聲明指針變量:

int * pi, n;

一旦n的值已知,就讓程序調(diào)用malloc()函數(shù)為數(shù)組分配存儲空間:

pi = malloc(n * sizeof(int));

if(pi == NULL) return -1;

當pi指向分配動態(tài)分配的內(nèi)存塊時,就可以忽略pi是指針的事實,將它作為數(shù)組名使用,這是C語言數(shù)組和指針形成緊密關系的所帶來的便利。由于數(shù)組名是該數(shù)組首元素的地址,如果讓pi指向這個塊的首元素,便可以象使用數(shù)組名一樣使用它。即可以使用pi[0]訪問該塊的首元素,pi[1]訪問第2個元素,以此類推。比如,使用下列循環(huán)對pi指向的數(shù)組進行初始化:

for(i = 0; i 《 n; i++) pi[i] = 0;

動態(tài)內(nèi)存分配可以提供更多的靈活性,比如:

char *pcStr;

char *pcStr = malloc(strlen(“OK!”) + 1);

strcpy(pcStr, “OK!”);

在這里,使用strlen()計算字符串的長度,一定要記得加上結束符NUL。為何不用sizeof呢?因為szieof會返回數(shù)組和指針的長度,而不是字符串的長度。

》》》 1.9.2 calloc()函數(shù)

雖然可以用malloc()函數(shù)為數(shù)組分配內(nèi)存,但C語言提供了一種更好用的calloc()函數(shù),其函數(shù)原型如下:

void *calloc(size_t nmenb, size_t size);

calloc()函數(shù)為nmemb個元素的數(shù)組分配內(nèi)存空間,其中,每個元素的長度都是size個字節(jié)。如果要求的空間無效,那么此函數(shù)返回指針。在分配了內(nèi)存之后,calloc()函數(shù)會通過將所有位設置為0的方式進行初始化。比如,調(diào)用calloc()函數(shù)為n個整數(shù)的數(shù)組分配存儲空間,且保證所有整數(shù)初始化為0。比如:

pi = calloc(n, sizeof(int));

因為calloc()函數(shù)會清楚分配的內(nèi)存,而malloc()函數(shù)不會,所以可以調(diào)用以“1”作為第一個實參的calloc()函數(shù),為任何類型的數(shù)據(jù)項分配空間。比如:

struct point{ int x, y;} *pi;

pi = calloc(1, sizeof(struct point));

在執(zhí)行此語句后,pi將指向一個結構體,且此結構體的成員x和y都會被設為0。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 周立功
    +關注

    關注

    38

    文章

    130

    瀏覽量

    37523
  • 大數(shù)據(jù)

    關注

    64

    文章

    8831

    瀏覽量

    137137
  • malloc
    +關注

    關注

    0

    文章

    52

    瀏覽量

    56

原文標題:周立功:動態(tài)分布內(nèi)存——malloc()函數(shù)與calloc()函數(shù)

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    內(nèi)存管理的硬件結構

    常見的內(nèi)存分配函數(shù)malloc,mmap等,但大家有沒有想過,這些函數(shù)在內(nèi)核中是怎么實現(xiàn)的?換句話說,Linux內(nèi)核的內(nèi)存管理是怎么實現(xiàn)的
    的頭像 發(fā)表于 09-04 14:28 ?179次閱讀
    <b class='flag-5'>內(nèi)存</b>管理的硬件結構

    malloccalloc功能來實現(xiàn)DAQ,在調(diào)試模式下調(diào)用callocmalloc函數(shù)時似乎卡住了,為什么?

    我正在使用 malloccalloc 功能來實現(xiàn) DAQ。 我使用的是 TLE9893 系列芯片。 代碼編譯良好,但在調(diào)試模式下調(diào)用 callocmalloc
    發(fā)表于 05-27 08:29

    你知道嗎? 51單片機也有動態(tài)內(nèi)存分配

    一、簡述其實在51單片機中也可以使用動態(tài)內(nèi)存動態(tài)內(nèi)存其實就是劃出一塊內(nèi)存區(qū)域,將這塊內(nèi)存進行管理,稱為內(nèi)存管理。51單片機可以使用c語言自
    的頭像 發(fā)表于 04-26 08:10 ?1206次閱讀
    你知道嗎? 51單片機也有<b class='flag-5'>動態(tài)內(nèi)存</b>分配

    如果沒有用到malloc和free函數(shù),是否會有ram動態(tài)使用率這一概念?

    如果沒有用到malloc和free函數(shù),是否會有ram動態(tài)使用率這一概念?
    發(fā)表于 04-12 06:29

    C語言內(nèi)存泄漏問題原理

    內(nèi)存泄漏問題只有在使用堆內(nèi)存的時候才會出現(xiàn),棧內(nèi)存不存在內(nèi)存泄漏問題,因為棧內(nèi)存會自動分配和釋放。C語言代碼中堆
    發(fā)表于 03-19 11:38 ?412次閱讀
    C語言<b class='flag-5'>內(nèi)存</b>泄漏問題原理

    C語言中的動態(tài)內(nèi)存管理講解

    本章將講解 C 中的動態(tài)內(nèi)存管理。C 語言為內(nèi)存的分配和管理提供了幾個函數(shù)。這些函數(shù)可以在 頭文件中找到。
    的頭像 發(fā)表于 02-23 14:03 ?343次閱讀
    C語言中的<b class='flag-5'>動態(tài)內(nèi)存</b>管理講解

    如何實現(xiàn)一個malloc

    任何一個用過或學過C的人對malloc都不會陌生。大家都知道malloc可以分配一段連續(xù)的內(nèi)存空間,并且在不再使用時可以通過free釋放掉。但是,許多程序員對malloc背后的事情并不
    的頭像 發(fā)表于 11-13 14:31 ?679次閱讀
    如何實現(xiàn)一個<b class='flag-5'>malloc</b>

    malloc 申請內(nèi)存的兩種方式

    我們知道malloc() 并不是系統(tǒng)調(diào)用,也不是運算符,而是 C 庫里的函數(shù),用于動態(tài)分配內(nèi)存。 malloc 申請
    的頭像 發(fā)表于 11-13 11:42 ?2412次閱讀
    <b class='flag-5'>malloc</b> 申請<b class='flag-5'>內(nèi)存</b>的兩種方式

    mtrace分析內(nèi)存泄露

    聲明及定義,函數(shù)原型為: void mtrace ( void ) ; mtrace原理 mtrace() 函數(shù)會為那些和動態(tài)內(nèi)存分配有關的函數(shù)(譬如
    的頭像 發(fā)表于 11-13 10:55 ?1199次閱讀
    mtrace分析<b class='flag-5'>內(nèi)存</b>泄露

    malloc在Linux上執(zhí)行的是哪個系統(tǒng)調(diào)用

    malloc底層為什么是內(nèi)存malloc大家都用過,其是庫函數(shù)。我們都知道庫函數(shù)在不同的操作系統(tǒng)中其實執(zhí)行的是系統(tǒng)調(diào)用,那么
    的頭像 發(fā)表于 11-13 10:36 ?884次閱讀
    <b class='flag-5'>malloc</b>在Linux上執(zhí)行的是哪個系統(tǒng)調(diào)用

    new和malloc的區(qū)別

    1. 申請的內(nèi)存所在位置 new操作符從自由存儲區(qū)(free store)上為對象動態(tài)分配內(nèi)存空間,而malloc函數(shù)從堆上
    的頭像 發(fā)表于 11-11 11:29 ?508次閱讀
    new和<b class='flag-5'>malloc</b>的區(qū)別

    malloc跟free的源碼分析

    _int_malloc()函數(shù),_int_malloc()函數(shù)才是內(nèi)存分配的核心實現(xiàn)。 public_m
    的頭像 發(fā)表于 11-09 11:39 ?1411次閱讀

    如何綁架C語言標準庫函數(shù)?

    C語言動態(tài)內(nèi)存可以使用 malloc 標準庫函數(shù),而 C++ 會使用 new 關鍵字申請,裸機情況下一般沒有問題,但是在 RTOS 情況下,就需要考慮資源保護的情況,比如多個任務同時
    發(fā)表于 11-01 09:50 ?408次閱讀

    如何綁架C語言標準庫函數(shù)?

    C語言動態(tài)內(nèi)存可以使用 malloc 標準庫函數(shù),而 C++ 會使用 new 關鍵字申請,裸機情況下一般沒有問題,但是在 RTOS 情況下,就需要考慮資源保護的情況
    發(fā)表于 11-01 09:50 ?300次閱讀

    函數(shù)類型和函數(shù)指針類型的區(qū)別

    平時用的更多的是函數(shù)指針類型,比如作為函數(shù)參數(shù)傳入回調(diào)函數(shù)等等。實際上函數(shù)類型也是可以作為函數(shù)的參數(shù)進行傳遞的。
    發(fā)表于 10-24 14:27 ?301次閱讀