首页 文章

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

提问于
浏览
2
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); 's how you can do ' memcpy附加'伙计们 . 谢谢你们!

4 回答

  • 2

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

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

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

  • 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

    只需创建一个数组

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

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

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

相关问题