標籤: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之後丟失原有指標。也能同一時候得到舊指標和新指標指向的記憶體塊。