日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

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

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

AGk5_ZLG_zhiyua ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2017-08-22 17:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

void *malloc(unsigned int size);

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

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

if(pi != NULL){

// 指針沒有問題

}else{

// 無效的指針

}

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

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

int * pi, n;

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

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

if(pi == NULL) return -1;

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

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

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

char *pcStr;

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

strcpy(pcStr, “OK!”);

在這里,使用strlen()計(jì)算字符串的長度,一定要記得加上結(jié)束符NUL。為何不用sizeof呢?因?yàn)閟zieof會返回?cái)?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個(gè)元素的數(shù)組分配內(nèi)存空間,其中,每個(gè)元素的長度都是size個(gè)字節(jié)。如果要求的空間無效,那么此函數(shù)返回指針。在分配了內(nèi)存之后,calloc()函數(shù)會通過將所有位設(shè)置為0的方式進(jìn)行初始化。比如,調(diào)用calloc()函數(shù)為n個(gè)整數(shù)的數(shù)組分配存儲空間,且保證所有整數(shù)初始化為0。比如:

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

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

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

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

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

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

    關(guān)注

    38

    文章

    130

    瀏覽量

    38807
  • 大數(shù)據(jù)
    +關(guān)注

    關(guān)注

    64

    文章

    9099

    瀏覽量

    144081
  • malloc
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    391

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

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請函數(shù)詳解:從原理到實(shí)戰(zhàn)

    次分配粒度" 巧妙解決了外碎片問題,而我們申請內(nèi)核內(nèi)存的所有操作,最終都要通過伙伴系統(tǒng)提供的核心函數(shù)來完成。
    的頭像 發(fā)表于 02-10 16:58 ?3743次閱讀
    Linux內(nèi)核伙伴系統(tǒng)<b class='flag-5'>內(nèi)存</b>申請<b class='flag-5'>函數(shù)</b>詳解:從原理到實(shí)戰(zhàn)

    指針與函數(shù)詳解

    的。 還有,將指針作為函數(shù)入?yún)⑶靶枰蛑羔樕暾?b class='flag-5'>內(nèi)存,而指針函數(shù)卻不用。 除去這兩點(diǎn),日常開發(fā)中,我還真沒找到指針函數(shù)的“優(yōu)點(diǎn)”,讓我覺得某個(gè)功能必須用指針
    發(fā)表于 01-23 06:02

    keil中c語言的動(dòng)態(tài)分配內(nèi)存

    動(dòng)態(tài)內(nèi)存分配我們可以自由更改分配的空間,使其“可大可小”。 1.常用的動(dòng)態(tài)內(nèi)存分配函數(shù)(都包含在頭文件中)(1)malloc和freemalloc是最常用到的
    發(fā)表于 01-21 06:04

    嵌入式開發(fā)常用函數(shù)速查表

    在嵌入式開發(fā)中,掌握常用函數(shù)的用法可以大大提高開發(fā)效率。無論是單片機(jī)初學(xué)者還是有一定經(jīng)驗(yàn)的工程師,熟悉函數(shù)庫和調(diào)用方式都是必備技能。今天,我們?yōu)榇蠹艺硪环萸度胧介_發(fā)常用函數(shù)速查表,覆蓋GPIO
    的頭像 發(fā)表于 01-19 09:06 ?482次閱讀
    嵌入式開發(fā)常用<b class='flag-5'>函數(shù)</b>速查表

    matlab調(diào)用dll動(dòng)態(tài)函數(shù),死機(jī)問題,如何強(qiáng)行跳出?

    matlab調(diào)用dll動(dòng)態(tài)庫中的函數(shù),例如圖莫斯,發(fā)送數(shù)據(jù)時(shí),經(jīng)常會卡死,是否有辦法限制時(shí)間,比如3秒,沒有回應(yīng),就強(qiáng)行結(jié)束函數(shù)調(diào)用。執(zhí)行后續(xù)邏輯。
    發(fā)表于 12-31 10:14

    內(nèi)存拷貝函數(shù) memcpy原理及實(shí)現(xiàn)

    內(nèi)存拷貝函數(shù)memcpymemcpy是memory copy的縮寫,意為內(nèi)存復(fù)制,在寫C語言程序的時(shí)候,我們常常會用到它。它的函原型如下:void *memcpy(void *dest, const
    發(fā)表于 12-26 08:03

    嵌入式系統(tǒng)中,動(dòng)態(tài)分配內(nèi)存可能發(fā)生的問題是什么?

    盡管不像非嵌入式計(jì)算機(jī)那么常見,嵌入式系統(tǒng)還是有從堆(heap)中動(dòng)態(tài)分配內(nèi)存的過程的。 那么嵌入式系統(tǒng)中,動(dòng)態(tài)分配內(nèi)存可能發(fā)生的問題是什么? 這 里,我期望應(yīng)試者能提到
    發(fā)表于 12-22 09:42

    三種類型內(nèi)存的使用

    的,因?yàn)榈讓訑?shù)據(jù)會被默默刪除。自動(dòng)存儲通常被稱為“?!?。 分配的存儲:運(yùn)行malloc() 會返回的內(nèi)存類型,這種內(nèi)存會一直保留,直到被 free() 函數(shù)釋放,所以可以被傳遞到任
    發(fā)表于 12-12 06:43

    為什么單片機(jī)中很少使用malloc,而PC程序頻繁使用呢?

    使用 malloc)變得不太適用,因?yàn)?b class='flag-5'>動(dòng)態(tài)內(nèi)存分配可能導(dǎo)致內(nèi)存碎片,造成內(nèi)存不足或系統(tǒng)崩潰。 PC:現(xiàn)代PC的內(nèi)存資源相對豐富,RAM通常在
    發(fā)表于 11-20 06:55

    使用函數(shù)塊實(shí)現(xiàn)三相電機(jī)正反轉(zhuǎn)控制

    在使用西門子S1200PLC,所使用的軟件是博途軟件,在這個(gè)軟件里運(yùn)用了塊的概念。比如我們常見的組織塊(OB)、函數(shù)塊(FB)、數(shù)據(jù)塊(DB)以及函數(shù)FC等。今天我們來具體交流一下這個(gè)函數(shù)塊(FB)的具體使用方法。
    的頭像 發(fā)表于 10-15 14:40 ?2930次閱讀
    使用<b class='flag-5'>函數(shù)</b>塊實(shí)現(xiàn)三相電機(jī)正反轉(zhuǎn)控制

    RTThread線程退出后rt_malloc動(dòng)態(tài)創(chuàng)建的資源沒有釋放怎么解決?

    測試過程中,在一個(gè)線程中用rt_malloc動(dòng)態(tài)創(chuàng)建4KB的資源,在線程運(yùn)行過程中用rt_thread_delete()使線程退出,用memtrace查看內(nèi)存分配情況,動(dòng)態(tài)創(chuàng)建的4KB
    發(fā)表于 10-13 07:06

    為什么立功要做汽車總線ZXDoc軟件?

    近年來,國內(nèi)汽車產(chǎn)業(yè)快速邁向智能化和網(wǎng)聯(lián)化,“軟件定義汽車”既成共識,立功汽車軟件ZXDoc的出現(xiàn)看似偶然,實(shí)則必然。ZLG致遠(yuǎn)電子:技術(shù)積淀與戰(zhàn)略布局的必然成果公司從2010年啟動(dòng)汽車總線
    的頭像 發(fā)表于 09-22 11:34 ?1456次閱讀
    為什么<b class='flag-5'>周</b><b class='flag-5'>立功</b>要做汽車總線ZXDoc軟件?

    rt_malloc_align函數(shù)內(nèi)存越界問題怎么解決?

    ; } 代碼如上所示。 條件:align = 4,rt_malloc申請到的內(nèi)存地址為0x2000001,sizeof(void*) = 4 結(jié)果: align_ptr = 0x2000004 則
    發(fā)表于 09-22 08:30

    詳解hal_entry入口函數(shù)

    當(dāng)使用RTOS時(shí),程序從main函數(shù)開始進(jìn)行線程調(diào)度;當(dāng)沒有使用RTOS時(shí),C語言程序的入口函數(shù)main函數(shù)調(diào)用了hal_entry函數(shù)。由于我們新建的工程是沒有選用RTOS的,因此,
    的頭像 發(fā)表于 07-25 15:34 ?2243次閱讀

    C語言中的內(nèi)聯(lián)函數(shù)與宏

    在C編程中,內(nèi)聯(lián)函數(shù)和宏都用于避免函數(shù)調(diào)用的開銷并編寫可復(fù)用的邏輯部分,但它們在工作方式和安全性方面存在顯著差異。
    的頭像 發(fā)表于 07-25 15:10 ?2099次閱讀
    C語言中的內(nèi)聯(lián)<b class='flag-5'>函數(shù)</b>與宏
    钦州市| 凌源市| 马公市| 祥云县| 大洼县| 台江县| 如东县| 白城市| 富顺县| 汝阳县| 大冶市| 烟台市| 乳源| 崇义县| 富顺县| 崇信县| 肇东市| 屏东市| 北碚区| 临西县| 扎鲁特旗| 城步| 怀安县| 邢台县| 鄢陵县| 鄯善县| 栖霞市| 当涂县| 南江县| 精河县| 彰化市| 茂名市| 瑞丽市| 延津县| 遂平县| 沙湾县| 九台市| 兴山县| 锦屏县| 九龙城区| 紫云|