代码之家  ›  专栏  ›  技术社区  ›  knittl

C++ MeMCPY返回值

  •  27
  • knittl  · 技术社区  · 14 年前

    根据 http://en.cppreference.com/w/cpp/string/byte/memcpy memcpy 接受三个参数:目标、源和大小/字节。它还返回一个指针。为什么会这样?参数不足以输入和复制数据。

    5 回复  |  直到 11 年前
        1
  •  59
  •   AnT stands with Russia    11 年前

    如果一个函数没有特定的返回,通常返回一个输入参数(被视为 一个)。这样做允许您在表达式中使用“链式”函数调用。例如,你可以

    char buffer[1024];
    strcat(strcpy(buffer, "Hello"), " World");
    

    strcpy 返回原始值 dst 作为结果的价值。基本上,在设计这样一个函数时,您可能希望为“链接”选择最合适的参数并将其作为结果返回(同样,如果您没有其他要返回的参数,也就是说,如果没有其他参数,您的函数将返回) void ).

    memcpy

    char *clone_buffer(const char *buffer, size_t size)
    {
       return memcpy(new char[size], buffer, size);
    }
    

    如果 内存

    char *clone_buffer(const char *buffer, size_t size)
    {
       char *clone = new char[size];
       memcpy(clone, buffer, size);
       return clone;
    }
    

    看起来“更长”。这两种实现在效率上没有任何区别。哪种版本更具可读性是有争议的。尽管如此,许多人还是会感激有这样一个“免费”的机会,写出上面第一个版本那样简洁的一行字。

    返回目标缓冲区指针,因为人们普遍认为从函数返回指针通常(或总是)表示函数可能会分配/重新分配内存。而这个 可以 事实上,对于后者,没有这样的硬性规则,也从来没有过,所以经常表达的观点是返回指针(比如 内存 是的)不知何故“错误”或“坏习惯”是完全没有根据的。

        2
  •  13
  •   Steve Jessop    14 年前

    IIRC,在早期版本的C中没有 void 返回。所以已经存在了足够长时间的库函数 因为传统的原因,这是他们能想到的最好的办法。

    string.h 返回目标参数: memcpy strcpy , strcat

    你可能会想到一个用法: char *nextbuf = memcpy(get_next_buf(), previous_buf+offset, previous_size-offset); char *nextbuf = get_next_buf(); memcpy(nextbuf, etc); 或者别的什么。

    qsort 返回void。它可以被定义为返回 base 根据“归还某物,它可能会派上用场”的原则,但事实并非如此。 std::copy 结束 输出范围的。对于非随机访问迭代器,调用方计算这些迭代器可能不是很简单,甚至不可能。

        3
  •  1
  •   Brandon E Taylor    14 年前

    通过返回值,memcpy函数的调用可以用作r值。

        4
  •  0
  •   mike jones    14 年前

    如果你想表明你没有使用它,你可以将返回值转换成一个空值-例如:
    (void) memcpy(mydest, mysrc, mybytes);

        5
  •  0
  •   Community c0D3l0g1c    4 年前
    void *memcpy(void* dest, const void* src, std::size_t count);
    //returns void * which can be assigned to another void array that can be used as int or char data type.
    void *ret = new int[6];
    ret = memcpy(newarr, arr, sizeof(int)* 5);