复制指针时 memcpy() 未按预期工作

memcpy() not working as expected when copying pointers

我想将char **pointer的内容复制到另一个指针。我的尝试是:


void test(char **arr, int len) {
    printf("1: ");
    printArr(arr, len);
    char ***res = malloc(sizeof(char **));
    res[0] = malloc(sizeof(char *) * len);
    memcpy(&res[0], arr, len);
    printArr(res[0], len); 

这里我只是想将包含多个字符串的arr的内容复制到r[0],其中len表示arr中的元素数。但是,在检查 res[0] 时,我意识到它只存储了两次 null。可以看出我是一个非常初学者,几天以来一直在学习 C,所以可以预料到简单的错误。

char ***res = malloc(sizeof(char **));
res[0] = malloc(sizeof(char *) * len);
memcpy(&res[0], arr, len);

第一行为单个 char ** 分配 space 并使 res 指向它

第二行为 len 指向 char 的数组分配 space 并使 res[0] 指向它。

第三行从 arr 复制 len byes 到 res 指向的内存顶部,覆盖第二次 malloc 调用的结果,然后在第一次 malloc 调用分配的块之后涂写内存.

你可能真的想要这样的东西

mempy(res[0], arr, len * sizeof(char*));

这会将 len 个指针数组(由 arr 指向)复制到第二个 malloc 调用分配的内存中。

如果这是您需要的 C 字符串数组深度复制:

char** array_deep_copy(char **arr, int len) {
    // calloc() makes "allocation of N" calculations more clear
    // that this is N allocations of char* becoming char**
    char **res = calloc(len, sizeof(char*));

    for (int i = 0; i < len; ++i) {
      // Use strdup() if available
      res[i] = strdup(arr[i]);
    }

    return res;
}

请注意,这需要一个适当的释放函数,该函数将递归地 free() 那些克隆的字符串或此 泄漏内存

如果只需要浅拷贝:

char** array_shallow_copy(char **arr, int len) {
    char **res = calloc(len, sizeof(char*));

    // memcpy(dest, src, size) is usually more efficient than a loop
    memcpy(res, arr, sizeof(char*) * len);

    return res;
}

这个不需要递归 free(),您只需 free() 顶级指针即可。这个与原来的共享数据,所以如果 any 这些指针在这个结构被释放之前被释放,那么你将在其中有无效的指针。小心!