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

如何将char *a[]的元素深拷贝到char *b[],避免修改a时影响b

深拷贝char*数组实现方案

你需要的是对数组做深拷贝,即单独复制每个指针指向的字符串内容,让a、b数组的对应指针指向独立内存空间,修改任意一边都不会影响另一方。

实现步骤

  • 引入必要头文件:string.h用于字符串操作,stdlib.h用于内存申请
  • 遍历数组每个元素,对非空的a[index]做如下处理:
    1. 计算目标字符串长度,额外加1预留字符串结束符\0的存储空间
    2. 调用malloc为b[index]申请对应大小的内存
    3. 调用strcpy将a[index]指向的内容完整拷贝到新申请的内存中
  • 所有内存使用完成后,需分别释放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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 18:06:11