c - 如何将双指针字符复制到另一个双指针字符?

标签 c memcpy double-pointer

假设我有一个函数返回一个带有新空间内存的双指针字符。我应该如何将双指针字符复制到另一个双指针字符?假设我将一个新长度 malloc 到双指针字符 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;
}

最佳答案

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

memcpy(A, B, oldLen);

简单地将 oldLen bytesB 中的地址复制到 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 的新扩展空间请求“适合”现有容量,则不需要实际重新分配。相反,实现可以简单地更新当前分配的“已用”量级,以注意现在使用了更多的容量,并且可以返回传入的相同指针。这会促进更高效的内存管理,如果您以小块进行调整,则可能会显着加快调整大小的速度。

只是需要考虑的事情。

关于c - 如何将双指针字符复制到另一个双指针字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40453294/

相关文章:

c - memcpy函数的实现

c - 在链表代码的尾部插入一个节点

c - 返回后出现段错误?

c - void 指针和不同大小的内存

c - 指针数组作为 C 函数中的参数

c - C 中最快的去交织操作?

C++ 错误 : 'No suitable conversion function from [class name] to “void *"

C - 赋值从指针生成整数而不进行强制转换

c - 逻辑错误-插入排序

c - 我的项目在尝试使用双重间接指针(char **)时崩溃