天天看點

通俗易懂說 realloc1. 作用2. 文法3. 注意4. realloc 實作原理5. 參考:

通俗易懂說 realloc

  • 1. 作用
  • 2. 文法
  • 3. 注意
  • 4. realloc 實作原理
  • 5. 參考:

1. 作用

動态調整申請記憶體大小

重新調整之前通過malloc或calloc所配置設定的記憶體塊大小

2. 文法

  1. 原型:

    extern void *realloc(void *mem_address, unsigned int newSize);

  2. 文法:

    指針名=(資料類型*)realloc(要改變記憶體大小的指針名,新的大小)

  3. 傳回值:

    如果配置設定成功則傳回被配置設定記憶體的指針;否則傳回NULL

  4. 說明:

    新申請的記憶體大小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);

  1. 若mem_address為空,即mem_address = NULL,則realloc同malloc一樣配置設定記憶體空間;
  2. 若mem_address不為空,且newSize < oldSize(即起始已配置設定記憶體大小),則縮小mem_address記憶體空間;即該記憶體塊尾部的部分記憶體被去除,剩餘部分記憶體依然保留,這樣可能會導緻資料丢失。
  3. 若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

繼續閱讀