如何使用memcpy
两个指针复制使用a
,b
两者都是unsigned char *
:
a
指向充满数据的内存(无符号字符)b
甚至没有分配
如何复制a
使用?第三个参数需要指向的内存大小,以字节为单位;如何得到它?b
memcpy
memcpy
a
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;
}
我们必须假设它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 */
}
假设“a”以空值结尾,您应该能够使用 strlenb(a) 来获取它的长度,使用 calloc 为目标指针分配内存,然后按照您的说明使用 memcpy。