一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

C語(yǔ)言

C語(yǔ)言入門(mén)知識:realloc函數

時(shí)間:2025-03-18 09:05:31 C語(yǔ)言 我要投稿
  • 相關(guān)推薦

C語(yǔ)言入門(mén)知識:realloc函數

  導語(yǔ):realloc原型是extern void *realloc(void *mem_address, unsigned int newsize);下面是其函數的相關(guān)知識,歡迎學(xué)習:

C語(yǔ)言入門(mén)知識:realloc函數

  函數說(shuō)明

  語(yǔ)法

  指針名=(數據類(lèi)型*)realloc(要改變內存大小的指針名,新的大小)。

  新的大小可大可小(但是要注意,如果新的大小小于原內存大小,可能會(huì )導致數據丟失,慎用!)

  頭文件

  #include有些編譯器需要#include,在TC2.0中可以使用alloc.h頭文件

  功能

  先判斷當前的指針是否有足夠的連續空間,如果有,擴大mem_address指向的地址,并且將mem_address返回,如果空間不夠,先按照newsize指定的大小分配空間,將原有數據從頭到尾拷貝到新分配的內存區域,而后釋放原來(lái)mem_address所指內存區域(注意:原來(lái)指針是自動(dòng)釋放,不需要使用free),同時(shí)返回新分配的內存區域的首地址。即重新分配存儲器塊的地址。

  返回值

  如果重新分配成功則返回指向被分配內存的指針,否則返回空指針NULL。

  注意

  當內存不再使用時(shí),應使用free()函數將內存塊釋放。

  相關(guān)函數

  1

  malloc、calloc、free、_alloca

  應用舉例

  舉例1

  從這個(gè)例子可以看出realloc函數的功能。

  運行環(huán)境:ubuntu 12.04 GCC 4.6.3

  運行結果:

  malloc 0x904f008

  realloc 0x904f008

  0 1 2 3 4 5 6 7 8 9

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13

  14

  15

  16

  17

  18

  #include

  #include

  int main()

  {

  inti;

  int*pn=(int*)malloc(5*sizeof(int));

  printf("malloc%p ",pn);

  for(i=0;i<5;i++)

  pn[i]=i;

  pn=(int*)realloc(pn,10*sizeof(int));

  printf("realloc%p ",pn);

  for(i=5;i<10;i++)

  pn[i]=i;

  for(i=0;i<10;i++)

  printf("%3d",pn[i]);

  free(pn);

  return 0;

  }

  舉例2

 。(在TC2.0中運行通過(guò))

  1

  2

  3

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13

  14

  15

  16

  17

  18

  19

  20

  21

  22

  //realloc.c

  #include

  #include

  main()

  {

  char*p;

  clrscr();//clearscreen

  p=(char*)malloc(100);

  if(p)

  printf("MemoryAllocatedat:%x",p);

  else

  printf("NotEnoughMemory! ");

  get);

  p=(char*)realloc(p,256);

  if(p)

  printf("MemoryReallocatedat:%x",p);

  else

  printf("NotEnoughMemory! ");

  free(p);

  get);

  return 0;

  }

  內存分配編輯

  如果有足夠空間用于擴大mem_address指向的內存塊,則分配額外內存,并返回mem_address。

  這里說(shuō)的是“擴大”,我們知道,realloc是從堆上分配內存的,當擴大一塊內存空間時(shí), realloc()試圖直接從堆上現存的數據后面的那些字節中獲得附加的字節,如果能夠滿(mǎn)足,自然天下太平。也就是說(shuō),如果原先的內存大小后面還有足夠的空閑空間用來(lái)分配,加上原來(lái)的空間大小= newsize。那么就ok。得到的是一塊連續的內存。

  如果原先的內存大小后面沒(méi)有足夠的空閑空間用來(lái)分配,那么從堆中另外找一塊newsize大小的內存。

  并把原來(lái)大小內存空間中的內容復制到newsize中。返回新的mem_address指針。(數據被移動(dòng)了)。

  老塊被放回堆上。

  例如

  1

  2

  3

  4

  5

  6

  7

  8

  9

  #include

  voidmain()

  {

  char*p,*q;

  p=(char*)malloc(10);

  q=p;

  p=(char*)realloc(q,20);//A行,通過(guò)realloc擴大p的空間,并把新的地址賦值給p。

  //…………………………

  }

  在這段程序中我們增加了指針q,用它記錄了原來(lái)的內存地址p。這段程序可以編譯通過(guò),但在執行到A行時(shí),如果原有內存后面沒(méi)有足夠空間將原有空間擴展成一個(gè)連續的新大小的話(huà),realloc函數就會(huì )以第二種方式分配內存,此時(shí)數據發(fā)生了移動(dòng),那么所記錄的原來(lái)的內存地址q所指向的內存空間實(shí)際上已經(jīng)放回到堆上了!這樣就會(huì )產(chǎn)生q指針的指針懸掛,即指針指向了一塊沒(méi)有分配給用戶(hù)使用的內存,如果再用q指針進(jìn)行操作就可能發(fā)生意想不到的問(wèn)題。所以在應用realloc函數是應當格外注意這種情況。

  返回情況

  返回的是一個(gè)void類(lèi)型的指針:調用成功。(這就要求在你需要的時(shí)候進(jìn)行強制類(lèi)型轉換)

  返回NULL:當需要擴展的大小(第二個(gè)參數)為0并且第一個(gè)參數不為NULL時(shí)。此時(shí)原內存變成“free(游離)”的了。

  返回NULL:當沒(méi)有足夠的空間可供擴展的時(shí)候。此時(shí),原內存空間的大小維持不變。

  特殊情況

  如果mem_address為NULL,則realloc()和malloc()類(lèi)似。分配一個(gè)newsize的內存塊,返回一個(gè)指向該內存塊的指針。

  如果newsize大小為0,那么釋放mem_address指向的內存,并返回NULL。

  如果沒(méi)有足夠可用的內存用來(lái)完成重新分配(擴大原來(lái)的內存塊或者分配新的內存塊),則返回NULL。而原來(lái)的內存塊保持不變。

  現存的數據然后就被拷貝至新的位置,而老塊則放回到堆上.重要的信息就是數據可能被移動(dòng)

  #include

  #include

  int main(int argc, char* argv[])

  {

  char *p,*q;

  p = (char *)malloc(10);

  q = p;

  p = (char *)realloc(p,10);

  printf("p=0x%x/n",p);

  printf("q=0x%x/n",q);

  return 0;

  }

  輸出結果:realloc后,內存地址不變

  p=0x431a70

  q=0x431a70

  例2:

  #include

  #include

  int main(int argc, char* argv[])

  {

  char *p,*q;

  p = (char *)malloc(10);

  q = p;

  p = (char *)realloc(p,1000);

  printf("p=0x%x/n",p);

  printf("q=0x%x/n",q);

  return 0;

  }

  輸出結果:realloc后,內存地址發(fā)生了變化

  p=0x351c0

  q=0x431a70

  例

  1 #include

  2 #include

  3 #include

  4

  5 int main(int argc, char **argv){

  6

  7 char *p, *p2, *pnew;

  8 int offset = 0;

  9

  10 p = (char *)malloc(10);

  11 if(!p){

  12 printf("malloc p error ");

  13 }

  14 strcpy(p, "Hello,");

  15 p2 = strchr(p,',');

  16 offset = p2-p+1;

  17

  18 pnew = (char *)realloc((void *)p, 20);

  19

  20 if(pnew){

  21 p = pnew;

  22 p2 = pnew + offset;

  23 strcpy(p2," world");

  24 }

  25 printf("string is: %s ",p);

  26 return 0;

  27 }

  執行結果:string is: Hello, world

  使用總結

  1. realloc失敗的時(shí)候,返回NULL

  2. realloc失敗的時(shí)候,原來(lái)的內存不改變,不會(huì )釋放也不會(huì )移動(dòng)

  3. 假如原來(lái)的內存后面還有足夠多剩余內存的話(huà),realloc的內存=原來(lái)的內存+剩余內存,realloc還是返回原來(lái)內存的地址; 假如原來(lái)的內存后面沒(méi)有足夠多剩余內存的話(huà),realloc將申請新的內存,然后把原來(lái)的內存數據拷貝到新內存里,原來(lái)的內存將被free掉,realloc返回新內存的地址

  4. 如果size為0,效果等同于free()。這里需要注意的是只對指針本身進(jìn)行釋放,例如對二維指針**a,對a調用realloc時(shí)只會(huì )釋放一維,使用時(shí)謹防內存泄露。

  5. 傳遞給realloc的指針必須是先前通過(guò)malloc(), calloc(), 或realloc()分配的

  6.傳遞給realloc的指針可以為空,等同于malloc。


【C語(yǔ)言入門(mén)知識:realloc函數】相關(guān)文章:

C語(yǔ)言入門(mén)知識:strstr函數03-28

C語(yǔ)言入門(mén)知識:strchr函數07-24

C語(yǔ)言函數入門(mén)學(xué)習06-02

C語(yǔ)言入門(mén)知識07-20

C語(yǔ)言入門(mén)必備知識04-12

C語(yǔ)言入門(mén)知識:常量08-31

C語(yǔ)言中g(shù)ets()函數知識08-10

c語(yǔ)言入門(mén)基礎知識07-18

C語(yǔ)言入門(mén)知識:位運算03-04

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看