close

今日再練習LinkList資料結構時,看到了malloc()函式就研究一下

current = (LNode *)malloc(sizeof(LNode));

//動態配置一LNode結構記憶體大小(Byte)並告知其為LNode的指標型態,把記憶體位置記錄在Current

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef struct LNode
{
 int data;
 struct LNode * rightNode;        
} LNode;

int main(int argc, char *argv[])
{
  int NewNumber,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("LinkedList  NO=%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");	
  return 0;
}

重點一:syntax:void * malloc(size_t size);
輸入參數: 所需記憶體大小,以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,可以用下面來達成:
char word[16];
但是如果要一個大小為 n,這個值『不是固定數的記憶體大小』,則要靠 malloc 來達成:
char *word = (char *)malloc(16 * sizeof(char));

程式中未知大小的記憶體需求,例如:一個計算班級平均成績的程式,先要求使用者輸入班級人數,
接著輸入每個人的成績。
然而班級人數程式無法事先得知,要等使用者輸入之後才知,這時候就需要用『動態配置記憶體』,
使記憶體大小隨著使用者輸入的人數而要求不同的大小。

同樣的狀況,使用靜態記憶體配置,配置 50 筆資料,如果使用者只需要 20 名,
剩下的 30 個空間就是浪費的;
如果使用者需要 80 名,這時候就不敷使用。
因此在未知大小的情況下,使用動態記憶體配置,是比較有效率的方式。

重點二:動態配置記憶體的優點

1.撰寫程式時程式設計者不需要限制程式所能處理的最多資料項目
2.製作資料結構
3.動態配置的記憶體其生命週期完全由程式設計者來控制

重點三:C 程式執行時所有的資料變數置於三種區域

資料區 (Data segment)︰全域變數, static 變數,常數。
堆疊區 (Stack)︰區域變數 (Auto variable),函式參數,暫時變數。
Heap 區︰動態配置的記憶體。

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

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 李山姆's Blog 的頭像
    李山姆's Blog

    李山姆的部落格

    李山姆's Blog 發表在 痞客邦 留言(0) 人氣()