realloc函數詳解

來源:互聯網
上載者:User
   原型:extern void *realloc(void *mem_address, unsigned int newsize);
   用法:#include <stdlib.h> 有些編譯器需要#include <alloc.h>
   功能:改變mem_address所指記憶體地區的大小為newsize長度。
   說明:如果重新分配成功則返回指向被分配記憶體的指標,否則返回null 指標NULL。
  當記憶體不再使用時,應使用free()函數將記憶體塊釋放。
  注意:這裡原始記憶體中的資料還是保持不變的。
   舉例
  // realloc.c
  #include <syslib.h>
  #include <alloc.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");
  getchar();
  p=(char *)realloc(p,256);
  if(p)
  printf("Memory Reallocated at: %x",p);
  else
  printf("Not Enough Memory!/n");
  free(p);
  getchar();
  return 0;
  }
  詳細說明及注意要點:
  1、如果有足夠空間用於擴大mem_address指向的記憶體塊,則分配額外記憶體,並返回mem_address
  這裡說的是“擴大”,我們知道,realloc是從堆上分配記憶體的,當擴大一塊記憶體空間時, realloc()試圖直接從堆上現存的資料後面的那些位元組中獲得附加的位元組,如果能夠滿足,自然天下太平。也就是說,如果原先的記憶體大小後面還有足夠的空閑空間用來分配,加上原來的空間大小= newsize。那麼就ok。得到的是一塊連續的記憶體。
  2、如果原先的記憶體大小後面沒有足夠的空閑空間用來分配,那麼從堆中另外找一塊newsize大小的記憶體。
  並把原來大小記憶體空間中的內容複寫到newsize中。返回新的mem_address指標。(資料被移動了)。
  老塊被放回堆上。
  例如:
  #include <malloc.h>
  void main()
  {
  char *p,*q;
  p = (char * ) malloc (10);
  q=p;
  p = (char * ) realloc (p,20); //A
  …………………………
  }
  在這段程式中我們增加了指標q,用它記錄了原來的記憶體位址p。這段程式可以編譯通過,但在執行到A行時,如果原有記憶體後面沒有足夠空間將原有空間擴充成一個連續的新大小的話,realloc函數就會以第二種方式分配記憶體,此時資料發生了移動,那麼所記錄的原來的記憶體位址q所指向的記憶體空間實際上已經放回到堆上了!這樣就會產生q指標的指標懸掛,如果再用q指標進行操作就可能發生意想不到的問題。所以在應用realloc函數是應當格外注意這種情況。
  3、返回情況
  返回的是一個void類型的指標,調用成功。(這就再你需要的時候進行強制類型轉換)
  返回NULL,當需要擴充的大小(第二個參數)為0並且第一個參數不為NULL,此時原記憶體變成了“freed(游離)”的了。
  返回NULL,當沒有足夠的空間可供擴充的時候,此時,原記憶體空間的大小維持不變。
  4、特殊情況
  如果mem_address為null,則realloc()和malloc()類似。分配一個newsize的記憶體塊,返回一個指向該記憶體塊的指標。
  如果newsize大小為0,那麼釋放mem_address指向的記憶體,並返回null。
  如果沒有足夠可用的記憶體用來完成重新分配(擴大原來的記憶體塊或者分配新的記憶體塊),則返回null.而原來的記憶體塊保持不變。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.