【问题标题】:memcpy between 2 unsigned char* in cc中2个无符号字符*之间的memcpy
【发布时间】:2012-09-01 16:11:49
【问题描述】:

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

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

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

【问题讨论】:

  • 总结:你无法“得到”长度。用数据填写a 的人需要告诉你长度。这可能是通过向您传递字节数,或者可能是通过确保a 中的数据以某种方式结构化,让您可以通过读取部分或全部数据来计算长度(例如 NUL 终止,包含一个长度字段)。

标签: c memcpy


【解决方案1】:
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'是'unsigned char *'。 OP从未说过'a'是'array'。 '*a' 也只给出第一个字符。我不知道你想用上面的代码实现什么。请查阅。谢谢。
  • @Ayub - OP的问题充其量是模棱两可的。因此,我的答案只能由提示组成。我不确定你不同意什么,但也许你错过了这个答案顶部的一对 malloc/memcpy 语句作为一种可能的解决方案。另一种解决方案是当“a”根本不是数组时的 b=*a 情况。
【解决方案2】:

我们必须假设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 */
}

【讨论】:

  • 两点。 1) calloc 比 malloc 效率低。 calloc 会将数组中的每个字节初始化为 0。然后你的 memcpy 将覆盖每个字节。 2) 在不了解 OP 的更多细节的情况下,您不能假设数据是字符串,特别是如果它被声明为 unsigned char*。这通常但并非总是意味着二进制数据数组。
  • OP 要求使用“memcpy”。 OP本人不知道获得长度的方法。获取(希望以 NUL 结尾的)字符串长度的一种方法是 strlen()。 OP最后询问“如何”获得长度。如您所知,如果不知道二进制数据的长度,就不可能将其复制到另一个位置。
【解决方案3】:

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

【讨论】:

  • 如果分配b 大小为strlen(a),那么b 将不会是a 的精确副本,因为它不会以空值终止。
  • 我从来没有说过只分配 strlenb(a) 字节,是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2013-04-06
  • 2021-10-31
  • 2018-10-08
  • 2017-11-11
  • 1970-01-01
相关资源
最近更新 更多