[C&C++] malloc()用法--動態記憶體配置函式 - 李山姆的部落格

文章推薦指數: 80 %
投票人數:10人

今日再練習LinkList資料結構時,看到了malloc()函式就研究一下current = (LNode *)malloc(sizeof(LNode)); //動態配置一LNode結構記憶體大小. 李山姆的部落格 跳到主文 歡迎光臨李山姆在痞客邦的小天地 部落格全站分類:職場甘苦 相簿 部落格 留言 名片 公告版位 May04Fri201207:01 [C&C++]malloc()用法--動態記憶體配置函式 今日再練習LinkList資料結構時,看到了malloc()函式就研究一下 current=(LNode*)malloc(sizeof(LNode)); //動態配置一LNode結構記憶體大小(Byte)並告知其為LNode的指標型態,把記憶體位置記錄在Current #include #include #include typedefstructLNode { intdata; structLNode*rightNode; }LNode; intmain(intargc,char*argv[]) { intNewNumber,numIndex; LNode*head=NULL; LNode*current=NULL; LNode*prev=NULL; printf("sizeof(LNode*)=%dbyte\n",sizeof(LNode*)); printf("sizeof(LNode)=%dbyte\n",sizeof(LNode)); while(1) { printf("請輸入串列資料="); scanf("%d",&NewNumber); if(NewNumber==-1) break; current=(LNode*)malloc(sizeof(LNode)); assert(current!=NULL); current->rightNode=NULL; current->data=NewNumber; if(head==NULL) {head=current;} else {prev->rightNode=current;} prev=current; } current=head; numIndex=0; while(current!=NULL) { printf("LinkedListNO=%d,data=%d,MM=%i\n",++numIndex,current->data,current); /*用了多次new/malloc來做記憶體配置。

在這種狀況下,不能保證這幾次allocate到的記憶體會是連續的*/ current=current->rightNode; } current=head; while(current!=NULL) { prev=current; current=current->rightNode; free(prev); } system("PAUSE"); return0; } 重點一:syntax:void*malloc(size_tsize);輸入參數:所需記憶體大小,以byte來計算。

回傳結果:void*,故使用上必須告知此指標的資料型態或結構。

一般使用方式:(1)使用sizeof運算,來決定所需記憶體1個單位的結構大小。

ex:sizeof(double),會計算1個double所需的byte數。

sizeof裡也可放一個stucture。

(2)乘上所需的記憶體單位數。

ex:m*sizeof(double),會計算m個double所需byte數。

(3)將回傳指標轉換成所需指標ex:pDouble=(double*)malloc(m*sizeof(double)),會把所要求的m*sizeof(double)大小記憶體位置,轉換成double指標,放到pDouble中。

這個函數的目的,是為了要動態的要求一塊記憶體。

我們需要一個大小為16的char,可以用下面來達成:charword[16];但是如果要一個大小為n,這個值『不是固定數的記憶體大小』,則要靠malloc來達成:char*word=(char*)malloc(16*sizeof(char));程式中未知大小的記憶體需求,例如:一個計算班級平均成績的程式,先要求使用者輸入班級人數,接著輸入每個人的成績。

然而班級人數程式無法事先得知,要等使用者輸入之後才知,這時候就需要用『動態配置記憶體』,使記憶體大小隨著使用者輸入的人數而要求不同的大小。

同樣的狀況,使用靜態記憶體配置,配置50筆資料,如果使用者只需要20名,剩下的30個空間就是浪費的;如果使用者需要80名,這時候就不敷使用。

因此在未知大小的情況下,使用動態記憶體配置,是比較有效率的方式。

重點二:動態配置記憶體的優點 1.撰寫程式時程式設計者不需要限制程式所能處理的最多資料項目2.製作資料結構3.動態配置的記憶體其生命週期完全由程式設計者來控制 重點三:C程式執行時所有的資料變數置於三種區域 資料區(Datasegment)︰全域變數,static變數,常數。

堆疊區(Stack)︰區域變數(Autovariable),函式參數,暫時變數。

Heap區︰動態配置的記憶體。

所以,malloc()使用時是利用Heap區的記憶體來配置,且記憶體位置並沒有接續,是由OS來提供位置,這點必須強調。

全站熱搜 創作者介紹 李山姆'sBlog 李山姆的部落格 李山姆'sBlog發表在痞客邦留言(0)人氣() E-mail轉寄 全站分類:進修深造個人分類:C,C++此分類上一篇:[C,C++]typedefstruct用法說明 上一篇:[分享好文]該如何學好"寫程式"? 下一篇:[Ubuntu]命令列(終端機視窗)在哪裡?!&如何安裝VMwareToolsbyUbuntu12.0版本 ▲top 留言列表 禁止留言 最新文章 文章分類 生活隨筆(2) 胡言亂語(0)分享好文(2) 程式設計(3) C,C++(2)C#(0)HTML(0) 伺服器相關(2) Linux(1)MSServer(0) POWEREDBY (登入) 關閉視窗



請為這篇文章評分?