<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>
            C語言

            C語言入門知識:realloc函數

            時間:2025-03-18 09:05:31 C語言 我要投稿
            • 相關推薦

            C語言入門知識:realloc函數

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

            C語言入門知識:realloc函數

              函數說明

              語法

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

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

              頭文件

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

              功能

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

              返回值

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

              注意

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

              相關函數

              1

              malloc、calloc、free、_alloca

              應用舉例

              舉例1

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

              運行環境: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中運行通過)

              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。

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

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

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

              老塊被放回堆上。

              例如

              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行,通過realloc擴大p的空間,并把新的地址賦值給p。

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

              }

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

              返回情況

              返回的是一個void類型的指針:調用成功。(這就要求在你需要的時候進行強制類型轉換)

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

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

              特殊情況

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

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

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

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

              #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后,內存地址發生了變化

              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失敗的時候,返回NULL

              2. realloc失敗的時候,原來的內存不改變,不會釋放也不會移動

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

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

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

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


            【C語言入門知識:realloc函數】相關文章:

            C語言入門知識:strstr函數03-28

            C語言入門知識:strchr函數07-24

            C語言函數入門學習06-02

            C語言入門知識07-20

            C語言入門必備知識04-12

            C語言入門知識:常量08-31

            C語言中gets()函數知識08-10

            c語言入門基礎知識07-18

            C語言入門知識:位運算03-04

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看