如何将双指针字符复制到另一个双指针字符?
How to copy a Double Pointer char to another double pointer char?
假设我有一个函数 return 一个带有新 space 内存的双指针字符。我应该如何将双指针字符复制到另一个双指针字符?假设我将一个新长度 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
字节从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 字节。当然,它会记住您要求的尺寸,但它也有一个内部容量。如果您新扩展的 space 请求在现有容量内 realloc
"fits",则不需要实际重新分配。相反,该实现可以简单地更新当前分配的 "used" 大小以注意现在使用了更多的容量,并且可以返回传入的 same 指针。这可以促进更有效的内存管理,如果您以小块进行调整,则调整大小的速度可能会显着加快。
只是需要考虑的事情。
假设我有一个函数 return 一个带有新 space 内存的双指针字符。我应该如何将双指针字符复制到另一个双指针字符?假设我将一个新长度 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
字节从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 字节。当然,它会记住您要求的尺寸,但它也有一个内部容量。如果您新扩展的 space 请求在现有容量内 realloc
"fits",则不需要实际重新分配。相反,该实现可以简单地更新当前分配的 "used" 大小以注意现在使用了更多的容量,并且可以返回传入的 same 指针。这可以促进更有效的内存管理,如果您以小块进行调整,则调整大小的速度可能会显着加快。
只是需要考虑的事情。