2

如何使用memcpy两个指针复制使用ab两者都是unsigned char *

  1. a指向充满数据的内存(无符号字符)
  2. b甚至没有分配

如何复制a使用?第三个参数需要指向的内存大小,以字节为单位;如何得到它?bmemcpymemcpya

4

3 回答 3

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;
}
于 2012-09-01T16:19:55.060 回答
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 */
}
于 2012-09-01T16:40:43.677 回答
1

假设“a”以空值结尾,您应该能够使用 strlenb(a) 来获取它的长度,使用 calloc 为目标指针分配内存,然后按照您的说明使用 memcpy。

于 2012-09-01T16:15:26.257 回答