You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中调整动态分配数组大小?无需额外数组或重分配删原数组

C语言中调整动态数组大小的高效方法

C语言里没有像C++ std::vector那样封装好的动态数组,但标准库提供的realloc()函数就是你要找的“更巧妙”的解决方案——它可以直接调整动态分配数组的大小,大多数情况下不需要手动复制数据或额外数组。

核心用法与机制

realloc()定义在<stdlib.h>头文件中,原型为:

void *realloc(void *ptr, size_t new_size);
  • 第一个参数是你之前用malloc()或calloc()分配的动态内存指针;第二个参数是调整后的内存总大小(单位:字节)。
  • 它的工作逻辑:
    • 如果原内存块后面有足够的连续空闲空间,直接扩展原内存块,返回原指针,完全不需要复制数据,这是最优的情况。
    • 如果原内存块后面空间不足,它会自动在内存中找到新的足够大的连续块,把原数据复制过去,然后释放原内存块,返回新指针——这一步复制是库自动完成的,不用你手动写循环复制。
    • 如果是缩容(new_size小于原大小),它会直接截断内存块,保留前new_size字节的数据,超出部分的内存会被回收(数据会丢失)。

实际代码示例

#include <stdlib.h>
#include <stdio.h>

int main() {
    // 初始分配5个int的动态数组
    int *arr = malloc(5 * sizeof(int));
    if (arr == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }

    // 填充初始数据
    for (int i = 0; i < 5; i++) {
        arr[i] = i + 1;
    }

    // 扩容到10个int的空间
    int *temp_arr = realloc(arr, 10 * sizeof(int));
    if (temp_arr == NULL) {
        fprintf(stderr, "扩容失败,原数组保留\n");
        // 扩容失败时,原arr仍有效,需要后续手动释放
    } else {
        arr = temp_arr;
        // 给新增的空间赋值(可选,因为realloc不会初始化新增空间)
        for (int i = 5; i < 10; i++) {
            arr[i] = i + 1;
        }
    }

    // 缩容到3个int的空间
    temp_arr = realloc(arr, 3 * sizeof(int));
    if (temp_arr != NULL) {
        arr = temp_arr;
    }

    // 打印结果
    for (int i = 0; i < 3; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 释放最终的内存
    free(arr);
    return 0;
}

关键注意事项

  • 只能用realloc()处理动态分配的内存(malloc()/calloc()/realloc()返回的指针),不能用在栈上的数组或静态数组上,否则会触发未定义行为。
  • 必须检查realloc()的返回值:如果返回NULL,说明内存分配失败,原内存块不会被释放,你需要手动处理原指针的释放。
  • realloc()不会初始化新增的内存空间(扩容时),如果需要初始值,要自己用memset()或循环赋值;缩容时,超出新大小的部分数据会被丢弃。

对比你之前手动复制再删除原数组的方法,realloc()利用了内存管理器的内部信息,能尽可能避免不必要的数据复制,代码更简洁,效率也更高。

内容的提问来源于stack exchange,提问作者Đức Lâm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:10:15