【问题标题】:How to copy a Double Pointer char to another double pointer char?如何将双指针字符复制到另一个双指针字符?
【发布时间】:2016-11-06 19:02:28
【问题描述】:

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

【问题讨论】:

  • oldLen * sizeof(*A)。您已经对分配进行了正确的计算。为什么不在你的memcpy 上也这样做呢?或者更好的是,realloc
  • @n.m.他不是在复制一个字符数组,而是一个指针数组。
  • @WhozCraig 你的意思是'memcpy(A, B, oldLen * sizeof(*A));'吗?我已经研究了如何使用 memcpy 很长时间了,我注意到 void *memcpy(void *dest, const void *src, size_t n);是如何使用 memcpy...我只是在想如果 A 和 B 是双指针,我什至可以使用 memcpy 将数组指针复制到另一个?
  • @WhozCraig 嗯,可能是这样。
  • @HxH memcpycopy size bytessrcdst。计算字节数是您的工作,就像您在执行malloc 时所做的那样。由于Achar**,那么sizeof(*A) 等于A 将指向的大小,以字节为单位,即char*,因此oldLen * sizeof(*A)oldLen 的字节数char* 要求。如果这样更容易理解,您也可以轻松使用oldLen * sizeof(char*)

标签: c memcpy double-pointer


【解决方案1】:

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

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

只是需要考虑的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2010-09-27
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多