33

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

还是我误解了什么?示例不使用返回值

4

5 回答 5

60

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

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

特别是因为strcpy返回原始dst值作为其结果。基本上,在设计这样的函数时,您可能希望为“链接”选择最合适的参数并将其作为结果返回(同样,如果您注意到 else 要返回,即如果否则您的函数将返回void)。

有些人喜欢,有些人不喜欢。这是个人喜好的问题。C 标准库通常支持这种技术,这memcpy是另一个例子。一个可能的用例可能类似于

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

如果memcpy没有返回目标缓冲区指针,我们可能必须将上述实现为

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

看起来“更长”。这两种实现之间的效率没有任何差异。哪个版本更具可读性是有争议的。仍然有很多人可能会喜欢“免费”的机会来编写像上面第一个版本这样简洁的单行代码。

人们经常发现memcpy返回目标缓冲区指针令人困惑,因为普遍认为从函数返回指针应该通常(或总是)表明该函数可能分配/重新分配内存。虽然这可能确实表明后者,但没有这样的硬性规则,而且从来没有,所以经常表达的观点认为返回指针(就像这样memcpy做)在某种程度上是“错误的”或“不好的做法”是完全没有根据的。

于 2010-04-27T18:18:15.920 回答
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);Or something。

为了比较,qsort返回 void。本来可以按照base“归还东西,说不定能派上用场”的原则来定义归还,但事实并非如此。std::copy更有用地将迭代器返回到输出范围的末尾。对于调用者计算可能不是微不足道甚至不可能的非随机访问迭代器。

于 2010-04-27T18:07:14.807 回答
1

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

于 2010-04-27T18:01:11.473 回答
0

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

于 2010-04-27T18:36:47.123 回答
0
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);
于 2016-03-18T15:16:10.893 回答