如何将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
相关产品推荐
相关产品推荐

