#C 语言标准库函数 realloc
/*********************************************
* @brief 重新分配内存
* @param ptr 原先分配的内存地址
* @param size 需要分配的字节数
* @return 新分配的内存地址
********************************************/
void* realloc(void* ptr, size_t size);
说明
重新分配内存。
- 如果需要的内存空间小于原先以分配的内存,则缩小原先分配的内存
- 如果需要的内存空间大于原先以分配的内存,且原先的内存后面存在足够的连续空闲空间,则扩展原先分配的内存
- 如果需要的内存空间大于原先以分配的内存,且原先的内存后面不存在足够的连续空闲空间,则释放原先分配的内存并重新分配内存
返回的指针需要通过 free 进行释放。
参数
ptr
- 原先分配的内存空间size
- 需要分配的字节数
返回值
- 返回新分配的内存地址;可能不变仍为
ptr
- 失败时返回
NULL
;此时ptr
指向原内存空间仍然有效
#示例
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* ptr = (int*) malloc(4 * sizeof(int)); // 分配内存,4 个 int
int* newptr = (int*) realloc(ptr, 8 * sizeof(int)); // 重新分配内存,8 个 int
if (newptr != NULL) // 确认重新分配成功,否则将导致内存泄露
{
ptr = newptr;
}
free(ptr); // 释放内存
return 0;
}
说明:
示例中首先通过 malloc
分配了 4 个 int
的内存,然后通过 realloc
重新分配为 8 个 int
的内存。
在重新分配时,需要使用一个新的指针变量(newptr
)检查是否分配成功;然后再赋值给原先的指针变量(ptr
)。
如果像这样直接赋值给 ptr
:
ptr = (int*) realloc(ptr, 8 * sizeof(int)); // 重新分配内存,8 个 int
当 realloc
失败返回 NULL
时,ptr
被修改为 NULL
,而原先内存地址丢失,无法再被访问和释放,从而导致内存泄露。
#推荐阅读
#参考标准
- C23 standard (ISO/IEC 9899:2024):
- 7.22.3.5 The realloc function (p: TBD)
- C17 standard (ISO/IEC 9899:2018):
- 7.22.3.5 The realloc function (p: 254)
- C11 standard (ISO/IEC 9899:2011):
- 7.22.3.5 The realloc function (p: 349)
- C99 standard (ISO/IEC 9899:1999):
- 7.20.3.4 The realloc function (p: 314)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.10.3.4 The realloc function