如何将Double Pointer char复制到另一个双指针char?

时间:2016-11-06 19:02:29

标签: c memcpy double-pointer

假设我有一个函数返回带有新空间内存的双指针char。我应该如何将双指针char复制到另一个双指针char?假设我将一个新长度malloc给双指针char A和一个旧数组B.

char **newArray(char **B, int oldLen, int newLen){ 
    char **A = malloc(newLen * sizeof(char*));
    // if(A == NULL){
    //  perror("Failed to allocate");
    //  exit(1);
    // }
    memcpy(A, B, oldLen);//can copy memory from B to A?
    free(B);
    return A;
}

1 个答案:

答案 0 :(得分:1)

您在复制的项目序列中缺少项目的字节大小。这样:

memcpy(A, B, oldLen);

只需将oldLen 字节B中保存的地址复制到A中保存的地址即可。除非你的项目大一个字节(并且它不是;它们是指针),否则计数不足。正如您在相同代码中的malloc调用之前所做的那样,项目大小必须包含在字节大小计算中:

memcpy(A, B, oldLen * sizeof (char*)); 

最后,您可以使用realloc来简化此代码

char **newArray(char **B, int oldLen, int newLen)
{ 
    char **A = realloc(B, newLen * sizeof(char*));sizeof(char*));
    if(A == NULL)
    {
        // Note: B is still valid here. What you want to do with it
        //  including nothing, is up to you. Your current logic just
        //  terminates the process, so we leave it alone and just exit.
        perror("Failed to allocate");
        exit(1);
    }
    return A;
}

如果实现中的内存管理器必须扩展序列,它将为您执行从旧缓冲区到新缓冲区的所有复制,并释放旧缓冲区。但是还有一个额外的好处:分配填充。

大多数现代动态内存管理器都有固定的分配页面大小。例如,无论您请求的分配有多小,分配器都可以向上舍入到最接近的倍数,例如16个字节。它会记住您请求的大小,当然,它还有一个内部容量。如果您对realloc的新扩展空间请求“适合”在现有容量范围内,则不需要实际重新分配。相反,实现可以简单地更新当前分配的“已使用”幅度,以记录现在使用的更多容量,并且可以返回传入的相同指针。这可以促进更有效的内存管理,如果你是以小块的形式这样做,可能会显着加快调整大小。

需要考虑的事情。