如何复制使用memcpy
两个指针a
,b
都是unsigned char *
:
a
指向充满数据的内存(unsigned char)b
甚至没有分配如何使用a
将b
复制到memcpy
? memcpy
的第三个参数需要a
指向的内存大小(以字节为单位);怎么弄明白?
答案 0 :(得分:5)
unsigned char* b = (unsigned char*)malloc(length_of_a);
memcpy(b, a, length_of_a);
当然,我不能告诉你如何获得“a”的长度。您无法可靠地调用memcpy如果您不知道或不将其作为变量。否则,任何调用memcpy的尝试本质上都是不安全的。
你真的想做什么?
完全有可能“a”根本不是阵列。在这种情况下,您不需要memcpy:
char b = '\0';
if (a != NULL)
{
b = *a;
}
答案 1 :(得分:3)
我们必须假设a
已终止NUL(以'\0'
结尾),否则我们无法确定其大小/长度(除非您自己知道a
的长度)。
char *a = "Hello World"; /* say for example */
size_t len = strlen(a)+1; /* get the length of a (+1 for terminating NUL ('\0') character) */
请注意,如果您知道a
所指向的字符串的长度(或保存在其中),那么您将其分配给len
,而不是使用上述语句。
char *b = calloc(1, len); /* */
memcpy(b, a, len); /* now b contains copy of a */
如果您打算复制一个字符串(NUL已终止),您可以使用strdup()
(在string.h
中声明):
char *b = strdup(a); /* b now has a copy of a */
注意:strdup()
在POSIX中。如果你想要严格的ANSI C,那么你可以像我前面提到的那样制作一个像下面这样的包装器:
unsigned char *my_strdup(const unsigned char *a)
{
size_t len = strlen(a)+1;
unsigned char *b = calloc(1, len);
if (b) return (unsigned char *) memcpy(b, a, len);
return NULL; /* if calloc fails */
}
答案 2 :(得分:1)
假设“a”为空终止,你应该能够使用strlenb(a)来获取它的长度,使用calloc为目标指针分配内存,然后使用你记下的memcpy。