通俗易懂說 realloc
- 1. 作用
- 2. 文法
- 3. 注意
- 4. realloc 實作原理
- 5. 參考:
1. 作用
動态調整申請記憶體大小
重新調整之前通過malloc或calloc所配置設定的記憶體塊大小
2. 文法
-
原型:
extern void *realloc(void *mem_address, unsigned int newSize);
-
文法:
指針名=(資料類型*)realloc(要改變記憶體大小的指針名,新的大小)
-
傳回值:
如果配置設定成功則傳回被配置設定記憶體的指針;否則傳回NULL
-
說明:
新申請的記憶體大小newSize可大可小,
如果newSize大于原先記憶體大小,則重新申請一塊newSize的大小記憶體塊
如果newSize小于原先記憶體大小,則縮減原記憶體空間,可能會導緻資料丢失
3. 注意
避免使用 oldPtr= realloc(oldPtr,newSize) 這種寫法,即使用原先指針oldPtr接收realloc的傳回值
因為如果配置設定失敗後,oldPtr原先指向的記憶體位址會丢失。
建議使用: newPtr = realloc(oldPtr,newSize)
4. realloc 實作原理
**extern void realloc(void mem_address, unsigned int newSize);
- 若mem_address為空,即mem_address = NULL,則realloc同malloc一樣配置設定記憶體空間;
- 若mem_address不為空,且newSize < oldSize(即起始已配置設定記憶體大小),則縮小mem_address記憶體空間;即該記憶體塊尾部的部分記憶體被去除,剩餘部分記憶體依然保留,這樣可能會導緻資料丢失。
-
若mem_address不為空,且newSize > oldSize(即起始已配置設定記憶體大小),則擴大mem_address記憶體空間,這裡分兩種情況讨論:
情況一:若mem_address尾部有足夠大的newSize空間,有則直接在尾部新增即可;
情況二:若mem_address尾部沒有有足夠大的newSize空間,則重新配置設定一塊記憶體空間,并将原先空間的記憶體資料拷貝到新配置設定的記憶體區域,并将原mem_address指向的記憶體釋放;
同時傳回新配置設定的記憶體空間。
5. 參考:
https://www.cnblogs.com/ren54/archive/2008/11/20/1337545.html
https://www.cnblogs.com/tangshiguang/p/6735402.html