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

C 如何将一个双指针字符复制到另一个双指针字符?,c,memcpy,double-pointer,C,Memcpy,Double Pointer,假设我有一个函数返回一个带有新空间内存的双指针字符。如何将双指针字符复制到另一个双指针字符?假设我将一个新的长度malloc转换为双指针字符a和一个旧的数组B char**newArray(char**B,int-oldLen,int-newLen){ char**A=malloc(newLen*sizeof(char*); //如果(A==NULL){ //perror(“未能分配”); //出口(1); // } memcpy(A,B,oldLen);//可以将内存从B复制到A吗? 免费(B

假设我有一个函数返回一个带有新空间内存的双指针字符。如何将双指针字符复制到另一个双指针字符?假设我将一个新的长度malloc转换为双指针字符a和一个旧的数组B

char**newArray(char**B,int-oldLen,int-newLen){
char**A=malloc(newLen*sizeof(char*);
//如果(A==NULL){
//perror(“未能分配”);
//出口(1);
// }
memcpy(A,B,oldLen);//可以将内存从B复制到A吗?
免费(B);
返回A;
}

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

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


只是要考虑的事情。

<代码> OLDLN * 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-hmm可能是这样的。@HxH
memcpy
size
字节从
src
复制到
dst
。计算字节数是您的工作,就像执行
malloc
时一样。由于
A
char**
,那么
sizeof(*A)
等于
A
所指向的大小(字节),即
char*
,因此
oldLen*sizeof(*A)
oldLen
char*
所需的字节数。您可以同样轻松地使用
oldLen*sizeof(char*)
,如果这样更容易理解的话。