2175

11 分钟

#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

创建于 2025/7/26

更新于 2025/8/1