C語言 realloc為什麼要有傳回值,realloc傳回值具體解釋/(解決隨意長度字串輸入問題)。

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   strong   資料   2014   

    在C語言操作中會用到大量的記憶體操作,當中非經常常使用的一個是realloc().


    由字面意思能夠知道,該函數的作用是用於又一次分配記憶體。

    使用方式例如以下:

    NewPtr=(資料類型*)realloc(OldPtr,MemSize)


    當中OldPtr指向 待又一次分配記憶體的指標。

    NewPtr指向 新分配空間的指標。

    MemSize為 分配後的空間大小。


    該函數的使用涉及下面幾個問題:

        1.不同情況下的返回值

        2.OldPtr指向的記憶體會不會自己主動釋放

        3.OldPtr和NewPtr各自是什麼內容,他們有什麼關係


    要解答這個問題,能夠從函數的動作流程出發來看:

      該函數依據記憶體是否滿足函數需求,完畢下面3個動作之中的一個:

        1.檢查OldPtr指向的記憶體塊後面的可用記憶體是否滿足本次realloc的需求,假設滿足,則將尾部的可用記憶體也分配給該記憶體塊——指標指向位置不變,記憶體塊內容不變,指向記憶體塊擴大。該情況下,返回值NewPtr = OldPtr;

        2.假設OldPtr指向記憶體塊後面的可用記憶體不夠realloc的需求。則完畢下面三個步驟<a>將在可用記憶體中又一次分配一段MemSize大小的記憶體,並將這段記憶體的開始地址返回給NewPtr。<b>將OldPtr記憶體塊的內容拷貝到NewPtr記憶體塊。<c>OldPtr的值不變,但其指向的記憶體塊被釋放(注意:是自己主動釋放,不用主動調用free)。

筆者某次運行動作2之後的情況

圖中程式的作用是:隨意長度字串的輸入——每輪迴圈輸入一個字元,將該字元追加於之前輸入的字元之後,使其構成一個字串,並對應增大該字串所佔領的記憶體空間。

        本人依次輸入了abcd....

        在輸入字元abc的時候,當輪迴圈運行realloc之後的結果是:1.Str和NewStr的值同樣,為0x00751cb8。2.其指向的內容一致,為“abc”

        在輸入到字元d的那一輪迴圈,運行realloc之後的結果是,1Str的值和NewStr的值不同了。2同一時候能夠發現Str指向的內容被重設為“鉿鉿鉿鉿鉿鉿……”查看其相應記憶體單元能夠發現,將被free重設後的記憶體 0xee 0xfe 0xee 0xfe……的序列,例如以所看到的。


        3.假設整個堆其中都沒有不論什麼一處的記憶體可以滿足realloc的需求。則此次分配失敗,返回值為NULL。

        結論:在程式中realloc使用中,將OldPtr和NewPtr使用同一個指標是不妥的。使用相應程式中的做法較為妥當。既然可以避免分配失敗返回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.