天天看點

realloc的全面解析

realloc也是在堆中開辟空間,但與普通的開辟空間不同。它用來擴大已經開辟好的空間。

用法為:

void *realloc(*mem_addr,unsigned int newsize)

含義是:(資料類型*)realloc(要擴大記憶體的指針名,新的記憶體大小)

這裡有2種情況:

1、夠開辟新的newsize,即mem_addr開始的空閑記憶體不小于newsize,則傳回mem_addr。

2、不夠開辟的newsize,即mem_addr開始的空閑記憶體小于newsize,則會換一個新的地方重新開辟newsize大小的記憶體,并将mem_addr處開始的資料自動拷貝到新的位址,mem_addr開始的原來的記憶體也自動釋放掉,不用手動free。傳回新的首位址。

關于傳回值:

1、如果參數mem_addr=NULL,則realloc與malloc一樣,開辟newsize大小的空間,傳回開辟的記憶體位址。

2、如果參數newsize=0,則釋放掉原記憶體空間,相當于free,傳回NULL。

3、“擴大”成功,傳回mem_addr。

4、不能再原位址擴大的,“重新開辟”成功,傳回新的記憶體位址。

5、“擴大”與“重新開辟”都不成功,則傳回NULL,原記憶體不變。

繼續閱讀