国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > realloc 以获得更好的体验。

# C 语言标准库函数 realloc

在头文件 stdlib.h 中定义。
自 C11 起,线程安全
/*********************************************
 * @brief 重新分配内存
 * @param ptr 原先分配的内存地址
 * @param size 需要分配的字节数
 * @return 新分配的内存地址
 ********************************************/
void* realloc(void* ptr, size_t size);

!subtitle:说明

重新分配内存。

  • 如果需要的内存空间小于原先以分配的内存,则缩小原先分配的内存

  • 如果需要的内存空间大于原先以分配的内存,且原先的内存后面存在足够的连续空闲空间,则扩展原先分配的内存

  • 如果需要的内存空间大于原先以分配的内存,且原先的内存后面不存在足够的连续空闲空间,则释放原先分配的内存并重新分配内存

返回的指针需要通过 free 进行释放。

!subtitle:参数

  • ptr - 原先分配的内存空间

  • size - 需要分配的字节数

!subtitle:返回值

  • 返回新分配的内存地址;可能不变仍为 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-11-27 09:38:09 创建于: 2025-11-27 09:38:09