在c中2个unsigned char *之间的memcpy

时间:2012-09-01 16:11:49

标签: c memcpy

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

  1. a指向充满数据的内存(unsigned char)
  2. b甚至没有分配
  3. 如何使用ab复制到memcpymemcpy的第三个参数需要a指向的内存大小(以字节为单位);怎么弄明白?

3 个答案:

答案 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。