如何将char *a[]的元素深拷贝到char *b[],避免修改a时影响b
深拷贝char*数组实现方案
你需要的是对数组做深拷贝,即单独复制每个指针指向的字符串内容,让a、b数组的对应指针指向独立内存空间,修改任意一边都不会影响另一方。
实现步骤
- 引入必要头文件:
string.h用于字符串操作,stdlib.h用于内存申请 - 遍历数组每个元素,对非空的
a[index]做如下处理:- 计算目标字符串长度,额外加1预留字符串结束符
\0的存储空间 - 调用
malloc为b[index]申请对应大小的内存 - 调用
strcpy将a[index]指向的内容完整拷贝到新申请的内存中
- 计算目标字符串长度,额外加1预留字符串结束符
- 所有内存使用完成后,需分别释放a、b数组每个元素指向的内存,避免内存泄漏
完整代码示例
#include <string.h> #include <stdlib.h> // 替换为你实际的数组长度 #define ARRAY_LENGTH 20 int main() { char *a[ARRAY_LENGTH] = {0}; char *b[ARRAY_LENGTH] = {0}; // 此处省略你对a数组的赋值逻辑 // 深拷贝核心逻辑 for (int i = 0; i < ARRAY_LENGTH; i++) { if (a[i] == NULL) { b[i] = NULL; continue; } // 计算长度,+1 存储 '\0' 结束符 size_t len = strlen(a[i]) + 1; b[i] = (char*)malloc(len); if (b[i] != NULL) { strcpy(b[i], a[i]); // 若为固定长度字符缓冲区,替换为 memcpy(b[i], a[i], 缓冲区长度) } } // 后续对a数组元素的修改、释放都不会影响b数组 // 使用完成后释放内存 for (int i = 0; i < ARRAY_LENGTH; i++) { free(a[i]); free(b[i]); a[i] = b[i] = NULL; } return 0; }
补充说明
如果你使用的平台支持strdup函数,可以直接用b[i] = strdup(a[i])完成内存申请+拷贝操作,效果和上述逻辑一致。但strdup不属于C标准库函数,跨平台场景建议自己实现上述逻辑兼容性更好。
内容的提问来源于stack exchange,提问作者SteamedBun
相关产品推荐
相关产品推荐

