国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
函數(shù)malloc()和calloc()

malloc函數(shù)

目錄[隱藏]

malloc函數(shù)簡介
舉例說明
malloc()函數(shù)的工作機制


malloc函數(shù)簡介


  原型:extern void *malloc(unsigned int num_bytes);
  頭文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 與 malloc.h 的內(nèi)容是完全一致的。)
  功能:分配長度為num_bytes字節(jié)的內(nèi)存塊
  說明:如果分配成功則返回指向被分配內(nèi)存的指針,否則返回空指針NULL。
  當內(nèi)存不再使用時,應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。

舉例說明


  /*malloc.c*/
  #include <syslib.h>
  #include <malloc.h>
  main()
  {
  char *p;
  clrscr(); /*clear screen*/
  p=(char *)malloc(100);
  if(p)
  printf("Memory Allocated at: %x",p);
  else
  printf("Not Enough Memory!\n");
  free(p);
  getchar();
  return 0;
  }
  函數(shù)聲明(函數(shù)原型):
  void *malloc(int size);
  說明:malloc 向系統(tǒng)申請分配指定size個字節(jié)的內(nèi)存空間。返回類型是 void* 類型。void* 表示未確定類型的指針。C,C++規(guī)定,void* 類型可以強制轉(zhuǎn)換為任何其它類型的指針。
  從函數(shù)聲明上可以看出。malloc 和 new 至少有兩個不同: new 返回指定類型的指針,并且可以自動計算所需要大小。比如:
  int *p;
  p = new int; //返回類型為int* 類型(整數(shù)型指針),分配大小為 sizeof(int);
  或:
  int* parr;
  parr = new int [100]; //返回類型為 int* 類型(整數(shù)型指針),分配大小為 sizeof(int) * 100;
  而 malloc 則必須由我們計算要字節(jié)數(shù),并且在返回后強行轉(zhuǎn)換為實際類型的指針。
  int* p;
  p = (int *) malloc (sizeof(int));
  第一、malloc 函數(shù)返回的是 void * 類型,如果你寫成:p = malloc (sizeof(int)); 則程序無法通過編譯,報錯:“不能將 void* 賦值給 int * 類型變量”。所以必須通過 (int *) 來將強制轉(zhuǎn)換。
  第二、函數(shù)的實參為 sizeof(int) ,用于指明一個整型數(shù)據(jù)需要的大小。如果你寫成:
  int* p = (int *) malloc (1);
  代碼也能通過編譯,但事實上只分配了1個字節(jié)大小的內(nèi)存空間,當你往里頭存入一個整數(shù),就會有3個字節(jié)無家可歸,而直接“住進鄰居家”!造成的結(jié)果是后面的內(nèi)存中原有數(shù)據(jù)內(nèi)容全部被清空。
  malloc 也可以達到 new [] 的效果,申請出一段連續(xù)的內(nèi)存,方法無非是指定你所需要內(nèi)存大小。
  比如想分配100個int類型的空間:
  int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個整數(shù)的內(nèi)存空間。
  另外有一點不能直接看出的區(qū)別是,malloc 只管分配內(nèi)存,并不能對所得的內(nèi)存進行初始化,所以得到的一片新內(nèi)存中,其值將是隨機的。
  除了分配及最后釋放的方法不一樣以外,通過malloc或new得到指針,在其它操作上保持一致。
  對其做一個特例補充
  char *ptr;
  if ((ptr = (char *)malloc(0)) == NULL)
  puts("Got a null pointer");
  else
  puts("Got a valid pointer");
  此時得到的是Got a valid pointer。把0賦給malloc能得到一個合法的指針。

malloc()函數(shù)的工作機制

  malloc函數(shù)的實質(zhì)體現(xiàn)在,它有一個將可用的內(nèi)存塊連接為一個長長的列表的所謂空閑鏈表。調(diào)用malloc函數(shù)時,它沿連接表尋找一個大到足以滿足用戶請求所需要的內(nèi)存塊。然后,將該內(nèi)存塊一分為二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的字節(jié))。接下來,將分配給用戶的那塊內(nèi)存?zhèn)鹘o用戶,并將剩下的那塊(如果有的話)返回到連接表上。調(diào)用free函數(shù)時,它將用戶釋放的內(nèi)存塊連接到空閑鏈上。到最后,空閑鏈會被切成很多的小內(nèi)存片段,如果這時用戶申請一個大的內(nèi)存片段,那么空閑鏈上可能沒有可以滿足用戶要求的片段了。于是,malloc函數(shù)請求延時,并開始在空閑鏈上翻箱倒柜地檢查各內(nèi)存片段,對它們進行整理,將相鄰的小空閑塊合并成較大的內(nèi)存塊。

 
 
 
 
 
 

函數(shù)malloc()和calloc()都可以用來動態(tài)分配內(nèi)存空間,但兩者稍有區(qū)別。

malloc()函數(shù)有一個參數(shù),即要分配的內(nèi)存空間的大小:

void *malloc(size_t size);

calloc()函數(shù)有兩個參數(shù),分別為元素的數(shù)目和每個元素的大小,這兩個參數(shù)的乘積就是要分配的內(nèi)存空間的大小。

void *calloc(size_t numElements,size_t sizeOfElement);

如果調(diào)用成功,函數(shù)malloc()和函數(shù)calloc()都將返回所分配的內(nèi)存空間的首地址。

函數(shù)malloc()和函數(shù)calloc()的主要區(qū)別是前者不能初始化所分配的內(nèi)存空間,而后者能。如

果由malloc()函數(shù)分配的內(nèi)存空間原來沒有被使用過,則其中的每一位可能都是0;反之,如果這部分內(nèi)存曾經(jīng)

被分配過,則其中可能遺留有各種各樣的數(shù)據(jù)。也就是說,使用malloc()函數(shù)的程序開始時(內(nèi)存空間還沒有

被重新分配)能正常進行,但經(jīng)過一段時間(內(nèi)存空間還已經(jīng)被重新分配)可能會出現(xiàn)問題。

函數(shù)calloc()會將所分配的內(nèi)存空間中的每一位都初始化為零,也就是說,如果你是為字符類型或整數(shù)類型的元

素分配內(nèi)存,那麼這些元素將保證會被初始化為0;如果你是為指針類型的素分配內(nèi)存,那麼這些元素通常會被

初始化為空指針;如果你為實型數(shù)據(jù)分配內(nèi)存,則這些元素會被初始化為浮點型的零。

需要包含頭文件:
#i nclude<<malloc.h>

#i nclude<<stdlib.h>>
函數(shù)聲明(函數(shù)原型):

void *malloc(int size);

說明:malloc 向系統(tǒng)申請分配指定size個字節(jié)的內(nèi)存空間。返回類型是 void* 類型。void*

表示未確定類型的指針。C,C++規(guī)定,void* 類型可以強制轉(zhuǎn)換為任何其它類型的指針。

從函數(shù)聲明上可以看出。malloc 和 new 至少有兩個不同: new 返回指定類型的指針,并且

可以自動計算所需要大小。比如:

int *p;
p = new int; //返回類型為int* 類型(整數(shù)型指針),分配大小為 sizeof(int);
或:int* parr;
parr = new int [100]; //返回類型為 int*

類型(整數(shù)型指針),分配大小為 sizeof(int) * 100;而 malloc 則必須由我們計算要字節(jié)數(shù),并且
在返回后強行轉(zhuǎn)換為實際類型的指針。

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

第一、malloc 函數(shù)返回的是 void * 類型,如果你寫成:p = malloc (sizeof(int)); 則程

序無法通過編譯,報錯:“不能將 void* 賦值給 int * 類型變量”。所以必須通過 (int *) 來將強制轉(zhuǎn)換。

第二、函數(shù)的實參為 sizeof(int) ,用于指明一個整型數(shù)據(jù)需要的大小。如果你寫成:

int* p = (int *) malloc (1);

代碼也能通過編譯,但事實上只分配了1個字節(jié)大小的內(nèi)存空間,當你往里頭存入一個整數(shù),就會有3個字

節(jié)無家可歸,而直接“住進鄰居家”!造成的結(jié)果是后面的內(nèi)存中原有數(shù)據(jù)內(nèi)容全部被清空。

malloc 也可以達到 new [] 的效果,申請出一段連續(xù)的內(nèi)存,方法無非是指定你所需要內(nèi)存大小。

比如想分配100個int類型的空間:

int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個整數(shù)的內(nèi)存空間。

另外有一點不能直接看出的區(qū)別是,malloc 只管分配內(nèi)存,并不能對所得的內(nèi)存進行初始化,所以得到的一片新內(nèi)存中,其值將是隨機的

除了分配及最后釋放的方法不一樣以外,通過malloc或new得到指針,在其它操作上保持一致

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
malloc()與calloc區(qū)別
C語言的那些小秘密之動態(tài)數(shù)組
一份通俗易懂的C語言內(nèi)存總結(jié)
calloc與malloc的區(qū)別
16-高級指針
C語言中手把手教你動態(tài)內(nèi)存分配
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服