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

如何将char数据复制到已定义的更小内存区?如何扩容*data实现memcpy?

问题分析与解决方案

你的核心问题是*data指向的内存空间不足以容纳data_new的内容,且不能直接赋值局部数组的地址(局部数组存在栈上,函数返回后内存会被回收,导致*data变成悬空指针)。你尝试的realloc思路是对的,但需要补充错误检查和正确的执行步骤:

正确实现步骤

  • 先通过realloc将*data指向的内存扩容至至少sizeof(data_new)的大小
  • 检查realloc的返回值,避免内存分配失败导致的问题
  • 扩容成功后执行memcpy完成数据复制

修正后的代码

#include <stdlib.h>
#include <string.h>

int function(char **data)
{
    char data_new[542] = {.......}; // 假设此处有初始化数据
    size_t needed_size = sizeof(data_new);
    
    // 扩容内存:realloc第一个参数为NULL时,等价于malloc
    char *temp = realloc(*data, needed_size);
    if (temp == NULL) {
        // 内存分配失败,返回错误码或做对应错误处理
        return -1;
    }
    *data = temp; // 更新指针到新分配的内存区域
    
    // 执行数据复制
    memcpy(*data, data_new, needed_size);
    return 1;
}

关键注意事项

  • 必须检查realloc返回值:如果内存不足,realloc会返回NULL,直接赋值给*data会丢失原内存地址,造成内存泄漏
  • 原内存必须来自堆:realloc仅适用于malloc/calloc/realloc分配的堆内存,若*data原本指向栈上数组(比如char buf[100]; function(&buf);),使用realloc属于未定义行为,必须避免
  • 无需额外扩容:你之前写的sizeof(data_new)*2是多余的,当前需求下分配刚好足够的空间即可;若后续需持续扩容,再考虑预留空间

内容的提问来源于stack exchange,提问作者pulpf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:03:10