C:字节复制无符号字符值

时间:2010-12-08 23:48:59

标签: c

void callback(const unsigned char* data, int len) {
 unsigned char copydatahere;
}

data是一个指向const的指针,它在库外分配。 len是一个数据大小,猜测它是sizeof(unsigned char)* N。

我如何将copydatahere分配给len的大小并将整个内存复制到data后面,包括空字节,字符串终止字符和其他任何具有字节表示的字符串?在这种情况下,bcopy和memcpy之间会有什么区别?


增加: memcpy(pointer+offset, sourcedata, size);这就是你怎么做'memcpy append'的人。谢谢大家!

4 个答案:

答案 0 :(得分:3)

使用memcpybcopy仅在某些平台上受支持,并且在较新的标准中已弃用。

void callback(const unsigned char* data, int len) {
  unsigned char* copydatahere = malloc(len);
  if (!copydatahere) {
    exit(1);
  }
  memcpy(copydatahere, data, len);

  /* ... */

  free(copydatahere);
}

答案 1 :(得分:2)

malloc(3)分配,与free(3)一起发布。 bcopy(3),虽然已弃用(因此更喜欢memmove(3)),但处理重叠的内存区域,memcpy(3)没有。

答案 2 :(得分:1)

#include <assert.h>
#include <stdlib.h>

void callback(const unsigned char *data, int len) {
  assert(len >= 0);
  unsigned char *copy = malloc(len);
  if (copy == NULL) { abort(); }
  memcpy(copy, data, len);
  /* TODO: Store the length somewhere, since otherwise the pointer is useless. */
  /* TODO: pass the pointer "copy" somewhere, so it is used. */
}

通常,这种回调函数的第二个参数是一些无符号类型,如unsigned intsize_t。因此,我添加了assert,以确保不存在任何未定义的行为

memcpy在C标准中定义明确,而bcopy是旧版本,不保证存在甚至按预期工作。 (虽然通常如果存在它会做你期望的。)

答案 3 :(得分:1)

只需创建一个数组

void callback(const unsigned char* data, int len) {
 unsigned char copydatahere[len];
 memcpy(copydatahere, data, len);
}

如果len可以任意大(例如400万),那么最好使用malloc,因为它可以告诉您分配是否成功(尽管某些配置中的某些操作系统)会欺骗你,告诉你足够的内存,只有当你试图访问它时才会崩溃)。如果上面的数组分配失败,则行为未定义。

但并非所有编译都支持具有可变大小的数组。