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 發表在 痞客邦 留言(0) 人氣()